Advanced Bash-Scripting Guide 第五至八章

2010年12月22日 星期三
/abs-guide/exit-status.html

疑问:
! ls | bogus_command 是否相当于 ! (ls | bogus_command)?

/abs-guide/tests.html
/abs-guide/testconstructs.html

1、算术结果的非零代表测试结果的状态零(成功)
如 if (( 1 )); then echo "success"; else echo "failed"; fi # success
if (( 0 )); then echo "success"; else echo "failed"; fi # failed
if (( 0 && 1 )); then echo "success"; else echo "failed"; fi # failed

如:
let "num = (( 0 && 1 ))"
echo $? # 1 ***
上面的算术运算结果是零,但是算术结果的零代表的测试结果的不成功(即非零,这里是1)

2、
测试的命令:
bash内建[, test(bash 内建命令优先)
命令:/usr/bin/[, /usr/bin/test
关键字: [[]](不像[],不是命令)

3、
测试的对象:
命令结果,字符串(非空字符串总是返回成功的0代码),算术运算结果 (()) 结果

单独的数字在测试结构[]中是当作字符串的,如下:
if [ 0 ]; then echo "success"; else echo "failed"; fi #success
if (( 0 )); then echo "success"; else echo "failed"; fi #failed

4、[[]] 比 [] 的测试结构用途更广泛
1)、前面可包括 && 、|| 等逻辑运算
2)、前者会自动进行不同进制的数字转换后再比较

/abs-guide/fto.html
疑问:
sed -e 's/^\|: *broken symbolic.*$/"/g'
为什么不用 sed -e 's/: *broken symbolic.*$/"/g'? “\|”表示什么?

疑问:
[ -h "$element" -a ! -e "$element" ] && echo \"$element\"
这里 -a 是逻辑 AND 的意思吗? 相当于 [[ -h "$element" && ! -e "$element" ]] ?
答:是的,参见:/abs-guide/comparison-ops.html compound comparison

/abs-guide/comparison-ops.html

1、
在[[]]内的测试会进行模式匹配,而在[]则不会,如下:
mdx@meng:~$ a="zoo"; [[ $a = z* ]] && echo "true"
true
mdx@meng:~$ a="zoo"; [ $a = z* ] && echo "true"
mdx@meng:~$ a="z*"; [ $a = z* ] && echo "true"
true

2、
字符串比较
if [[ "$a" < "$b" ]]
if [ "$a" \&2`" ] # (no output)
[ 1 -eq 2 -a -n "`echo true 1>&2`" ] # true

/abs-guide/nestedifthen.html

/abs-guide/operations.html

/abs-guide/ops.html

疑问:
Example 8-2. Using Arithmetic Operations 用法太多了,掌握一种可靠的( 如: let "n=$n+1" ),其余的有需要时查阅熟悉。

<<=
let "var <<= 2" 相当于 let "var = $var << 2"

todo:
此节算术运算在需要时具体掌握