SHELL脚本的一些特殊用法

  • +=运算符
数组追加:

$ arr=(1 2 3)
$ arr+=(4 5)

自然地我们会想到如果一个变量是数字,是否也可以用+=作运算呢?

$ i=1
$ i+=1
但是,运行后你会发现i的结果并不为2,而是11,这里bash并不认为i是一个整数,而是作为字符串。

这时可以通过declare声明一个变量为整数,上面的问题就解决了:

$ declare -i int=1
$ int+=1
$ echo $int
2
  • Here document不为人知的用法
一般的here document的用法是这样的:

$ cat b.sh 
cat<<EOF
hello, $USER
EOF
$ sh b.sh 
hello, kodango
here document中的变量都是会被展开的,那能不能不展开呢?答案是可以的,将EOF用引号括起来就可以:

$ cat b.sh 
cat<<"EOF"
hello, $USER
EOF
$ sh b.sh 
hello, $USER
一般here document用得最多的是在帮助函数(helpusage)函数里面,因为在这里我们要写一大段的脚本用法。

如果你有强迫症(比如我),有时候使用here document的时候会很不爽,因为here document里面每行首部的空格都会被保留,而如果要顶格写,在缩进的地方又会有点打乱结构,例如:

$ cat b.sh
# part 1
if :; then
cat << EOF
hello, $USER 
EOF
fi

# part 2
if :; then
if :; then
cat << EOF
hello, $USER 
EOF
fi
fi
上面的脚本执行的结果为:

$ sh b.sh 
hello, kodango # part 1 result
hello, kodango # part 2 result
有没有办法既兼顾到缩进又能不保留行首空格呢?

答案也是肯定的,只不过语法又要稍稍变一下,现在在<<的后面加一个短横,这个用法下,行首的Tab字符都会被忽略:

$ cat b.sh 
if :; then
cat <<- EOF
hello, $USER 
EOF
fi
$ sh b.sh 
hello, kodango
fi
一定要是Tab键哦,空格也是不可以的,在vim里面还要注意如果设置了smarttab选项,行首插入的Tab键会替换成相应个数的空格(这里可以按ctrl+v tab插入实际的空格)。

关于这一节的内容,可以进一步参考Redirection#here_documents [Bash Hackers Wiki]。
  • 善用let或者(())命令做算术运算
如何对一个数字做++运算,可能你会这样用:
a=1
a=`expr a + 1`
为何不用你熟悉的:

a=1
let a++
let a+=2
  • SHELL调试
1. 通过set -o命令来查看当前 shell 的选项配置。
2. set -x
这个可以打开 shell 的调试开关,调试 shell 脚本非常有用.
原文地址:https://www.cnblogs.com/eric-geoffrey/p/5012091.html