shell 高级应用
补充上次的基础使用。
eval
eval 会重复扫描你所输入的命令行两次,在这两次扫描中,会进行两次计算。
p="|"
eval ls $p grep
set
在Bash 执行脚本时候,会创建一个新的shell环境,这个Shell就是脚本的执行环境,Bash会赋予一个默认的环境的各种参数。
Set用来修改Shell环境的运行参数,即定制环境。
直接运行
直接运行会显示所有的环境变量和Shell参数。
set
Set -u
使用该命令在输出空变量时,就会报错。
set -u
# 等价于 set -o nounset
echo $a
# 运行结果:
bash: script.sh:行4: a: 未绑定的变量
set -x
在执行脚本时,并不会输出其他内容,屏幕只显示运行结果,假如想debug方便,便可使用set -x ,这样就会在显示运行结果之前,先输出执行的命令。
#!/bin/bash
set -x
# set -o xtrace
echo xx
# 执行结果:
+ echo xx
xx
set -e
使脚本遇到错误即停止执行。
# Just stop if there is any problem
set -e
Trick
在脚本中,最好设置set -ue,这样在使用一个没有设置的变量时,就会显示错误信息,然后退出,这样预防rm -rf ~/.这样的命令出现。
#!/bin/bash
set -ue
getopt
简单理解就是识别长短参数,将-[para] 与–[para]
下面举一个复杂例子
暂时我的理解是:将"$@"的所有的参数提取出,然后使用getopt 从新排列,并提取。最终使用set 将他们重新生成为命令行参数。
opts=($(getopt -o 短选项1[:]短选项2[:]...[:]短选项n -l 长选项1,长选项2,...,长选项n -- "$@"))
eval set -- "$opts"
shift
输入参数左移,
while [ $# -ne 0 ]
do
let sum+=$1
shift
done
echo "sum: $sum"
# 执行结果:
./shift.sh 1 2 3 4
sum: 10