slice1="$"
# = "path2/file.ext"
slice2="$"
# = "path2"
slice3="$"
# = "file.ext"(注意:"-"前有空格)
pos=6
len=5
slice4="$:$}"
# = "path2"
替换操作(使用globbing)
f="path1/path2/file.ext"
single_subst="$"
# = "x/path2/file.ext"
global_subst="$"
# = "x/x/file.ext"
# 字符串拆分
readonly DIR_SEP="/"
array=($/ })
second_dir="$"
# = path2
删除头部或尾部(使用globbing)
f="path1/path2/file.ext"
# 删除字符串头部
extension="$" # = "ext"
# 以贪婪匹配方式删除字符串头部
filename="$" # = "file.ext"
# 删除字符串尾部
dirname="$"
# = "path1/path2"
# 以贪婪匹配方式删除字符串尾部
root="$"
# = "path1"
避免使用临时文件
有些命令需要以文件名为参数,这样一来就不能使用管道。这个时候?
# 下载并比较两个网页
diff
还有一个非常有用处的是”here documents”,它能让你在标准输入上输入多行字符串。下面的’MARKER’可以替换成任何字词。
# 任何字词都可以当作分界符
command
...
$
$(cmd)
...
MARKER
如果文本里没有内嵌变量替换操作,你可以把第一个MARKER用单引号包起来:
command
...
no substitution is happening here.
$ (dollar sign) is passed through verbatim.
...
MARKER
内置变量
变量说明
$0脚本名称
$n传给脚本/函数的第n个参数
$$脚本的PID
$!上一个被执行的命令的PID(后台运行的进程)
$?上一个命令的退出状态(管道命令使用$)
$#传递给脚本/函数的参数个数
$@传递给脚本/函数的所有参数(识别每个参数)
$*传递给脚本/函数的所有参数(把所有参数当成一个字符串)
提示
使用$*很少是正确的选择。
$@能够处理空格参数,而且参数间的空格也能正确的处理。
使用$@时应该用双引号括起来,像”$@”这样。
调试
对脚本进行语法检查:
bash -n myscript.sh
跟踪脚本里每个命令的执行:
bash -v myscripts.sh
跟踪脚本里每个命令的执行并附加扩充信息:
bash -x myscript.sh
你可以在脚本头部使用set -o verbose和set -o xtrace来永久指定-v和-o。当在远程机器上执行脚本时,这样做非常有用,用它来输出远程信息。
什么时候不应该使用bash脚本
你的脚本太长,多达几百行
你需要比数组更复杂的数据结构
出现了复杂的转义问题
有太多的字符串操作
不太需要调用其它程序和跟其它程序管道交互
担心性能
这个时候,你应该考虑一种脚本语言,比如Python或Ruby。
END
领取专属 10元无门槛券
私享最新 技术干货