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