shell中有两类字符:普通字符、元字符。
普通字符在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本;元字符是Shell的保留字符,在Shell中有着特殊的含义。
$()
反引号和$()的作用相同,用于命令替换(command substitution),即完成引用的命令的执行,将其结果替换出来。
$(())
进行数学运算
$ a=5; b=7; c=2
$(( a+b*c ))
在 $(( )) 中的变量名称,可于其前面加 $ 符号来替换,也可以不用,如:
$(( $a + $b * $c))
${}
${} 用于变量替换。一般情况下,$var 与 ${var} 一样,但用 ${ } 会比较精确的界定变量名称的范围
特殊功能:假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt
${var:n}
若n为正数,n从0开始,表示在变量var中提取第n个字符到末尾的所有字符。若n为负数,提取字符串最后面n的绝对值个字符,使用时在冒号后面加空格或一个算术表达式或整个num加上括号
${file:1}:提取第1个字符及其后面的所有字符:dir1//dir2/dir3/my.file.txt
${file: -3}:提取最后3个字符,注意冒号后面添加一个空格:txt
${file:1-4}:提取最后3个字符,冒号后面不需要添加空格:txt
${file:(-3)}:提取最后3个字符,冒号后面不需要添加空格:txt
${var:n1:n2}
用于提取从下标n1开始后面n2个字符,其中下标n1与n2从0开始
${file:0:5}:提取最左边的5个字符:/dir1
${file:5:5}:提取从第5个字符开始右边的连续5个字符:/dir2
${/}与${//}
用于字符串模式匹配替换
${var/pattern1/pattern2}表示将var字符串pattern1替换为pattern2。
${file/dir/path}:将第一个dir替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir替换为path:/path1/path2/path3/my.file.txt
${#}、${##}、${%}与${%%}
用于字符串模式匹配截断
${file#*/}:拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最后一条 / 及其左边的字符串:my.file.txt
${file#*.}:拿掉第一个 . 及其左边的字符串:file.txt
${file##*.}:拿掉最后一个 . 及其左边的字符串:txt
${file%/*}:拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:拿掉第一条 / 及其右边的字符串:(空值)
${file%.*}:拿掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
# 是去掉左边(在鉴盘上 # 在 $ 之左边)
% 是去掉右边(在鉴盘上 % 在 $ 之右边)
单一符号是最小匹配﹔两个符号是最大匹配
${file#/}(不加*号)表示只去掉最左边的/
$0...$9代表shell文件参数
$@传给脚本的所有参数的列表
$# 获得参数列表的总个数
$*以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$脚本运行的当前进程ID号
$! 获得之前(上一个)进程 ID
$?显示最后命令的退出状态,(0 表示成功, 1 表示失败)
$- 是 set 命令的 –h 和 –B 的参数, 表示使用内置的 set 命令扩展解释之后的参数行,
$_ (下划线) 表示的是打印上一个输入参数行, 当这个命令在开头时, 打印输出文档的绝对路径名.