最近,为了给几个大二的同学回答一些shell问题。以前,总是以没有时间,推脱没有看shell十三问。
今天,找出来看了一下,发现里面的内容真是经典。
尤其是对于 ${ } 的一些特异功能:
为了完整起见,我这里再用一些例子加以说明 ${ } 的一些特异功能:
file=/dir1/dir2/dir3/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:5} #提取最左边的 5 个字节:/dir1
${file:5:5} #提取第 5 个字节右边的连续 5 个字节:/dir2
#对变量值里的字符串作替换:
${file/dir/path} #将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path} #将全部 dir 提换为 path:/path1/path2/path3/my.file.txt
#利用 ${ } 还可针对不同的变量状态赋值(没设定、空值、非空值):
${file-my.txt} #若 $file 没有设定,则使用 my.txt 作传回值。(空值及非空值时不处理)
${file:-my.txt} #若 $file 没有设定或为空值,则使用 my.txt 作传回值。 (非空值时不作处理)
${file+my.txt} #若 $file 设为空值或非空值,均使用 my.txt 作传回值。(没设定时不作处理)
${file:+my.txt} #若 $file 为非空值,则使用 my.txt 作传回值。 (没设定及空值时不作处理)
${file=my.txt} #若 $file 没设定,则使用 my.txt 作传回值,同时将 $file 赋值为 my.txt 。
(空值及非空值时不作处理)
${file:=my.file.txt} #若 $file 没设定或为空值,则使用 my.txt 作传回值,
同时将 $file 赋值为 my.txt 。 (非空值时不作处理)
${file?my.txt} #若 $file 没设定,则将 my.txt 输出至 STDERR。 (空值及非空值时不作处理)
${file:?my.txt} #若 $file 没设定或为空值,则将 my.txt 输出至 STDERR。 (非空值时不作处理)
tips:
以上的理解在于, 你一定要分清楚 unset 与 null 及 non-null 这三种赋值状态.
一般而言, : 与 null 有关, 若不带 : 的话, null 不受影响, 若带 : 则连 null 也受影响.
阅读(765) | 评论(0) | 转发(0) |