Blog Of Leung

personal blog & work notes

View project onGitHub
 

shell脚本中的变量替换

linux的bash shell代码中的变量替换,或者说变量设置,方式比较多。在看别人写的脚本的时候经常容易混乱,有必要总结一下。

常用的设置方式包括这八种:

:=句式、=句式、:-句式、-句式、:?句式、?句式、:+句式、+句式

这里先讨论前面六种,后面的:+句式和+句式先放到一边,因为它比较奇葩。。。测试用的代码如下:

#!/bin/bash
set -e

username=""  # username有三种测试设定,有非空定义,空定义,完全不定义,这三种
echo "${username:=$USER}" # 先测试上面说的前六种句式,看对username的值产生什么影响
echo $username

简单总结如下

  • 当username有非空定义时,六种情况下username的值都不会被替换
  • 当username有空定义时,六种情况中,只有带冒号的句式会改变username的值,其中:=句式会在全局改变username的值,:-句式仅仅会在${}范围内改变username的值,:?句式在改变username的值后会使脚本直接退出
  • 当username完全没定义时,六种情况中,username的值都会被替换,其中:=句式和=句式会在全局改变username的值,:-句式和-句式仅仅会在${}范围内改变username的值,:?句式和?句式在改变username的值后会使脚本直接退出

  • 至于:+句式和+句式,把它理解为:-句式和-句式的对立面即可

这么多样的变量设置方式,有什么用呢?

我的理解是这样的:

  • 情况一,变量是有定义的
  • 如果某个变量为空,我们就给它一个默认值,如果它不为空,就保持不变;这时就可以使用上面的句式的某一种
  • 如果需要全局修改变量的值,就使用:=句式;如果只需要在某个语句内修改变量的值,就使用:-句式;如果想判断某个变量是否为空,就使用:?句式,变量为空时它会使脚本退出

  • 情况二,变量是没有定义的

  • 这更简单,如果需要全局定义变量的值,就使用:=或者=句式;如果只需要在某个语句内修改变量的值,就使用:-或者-句式;如果想判断某个变量是否有定义,就使用:?或者?句式,变量无定义时它会使脚本退出

综上所述,:=和=是来给变量全局赋值的;:-和-是来给变量局部赋值的;:?和?是来判断变量是否为空或者是否未定义的;

:+和+比较特殊,只要变量有定义,+句式就可实现替换;变量有定义且非空,:+句式也可实现替换;变量无定义时,:+和+都无效。

Author:leung

24 Jan 2014

← Home

comments powered by Disqus