在变量名前面添加$可以引用变量的值。若此时变量没有被定义或变量的值为空,则使用$符号进行变量替换会得到一个空的字符串。而Shell可以提供一些高级形式的变量替换,可以基于变量的状态来操作变量的值。
案例:写一个调用编辑器文本文件,并在编辑以后显示文件内容的脚本,它接受三个命令行参数,分别是要操作的文本文件的路径、编辑文件所用的编辑器以及显示文本文件内容的显示程序。
#!/bin/bash#定义脚本使用函数help(){ echo echo "Usage:`basename $0` [ OPTION ] -f File" echo "Edit a Editable File using specified Editor and Pager." echo echo -e " -e [ Editor ]/tEditor to edit the file:vim,pico,emacs,nano..." echo -e " -p [ Pager ]/tPager to view the file:less,more,cat,head..." echo exit 1}#关闭诊断信息#OPTERR=0#处理命令行选项和参数while getopts f:e:p: OPTIONdo case "$OPTION" in f) #每一个选项的参数可以使用变量$OPTARG来访问TARGET_FILE="$OPTARG";; e) EDITOR="$OPTARG";; p) PAGER="$OPTARG";; /?) #当遇到未知选项时,显示脚本的使用方法help;; esacdone #文件参数必须被设置if [ -z "$TARGET_FILE" ]then help fiecho#确保文件是可读、可写的if [ -r "$TARGET_FILE" -a -w "$TARGET_FILE" ]then #询问用户是否想编辑文件 read -p "Do you want to editing file '$TARGET_FILE' (y/n)?" if [ "$REPLY"='y' -O "$REPLY" = 'Y' -o "$REPLY"="Yes" ] then echoecho "Opening file '$TARGET_FILE' using ${EDITOR:-vim}..."sleep 3#使用编辑器打开文件,如果变量EDITOR 为空使用vim${EDITOR:-vim} "$TARGET_FILE"echo "Thank you for editing the file." fi echo #询问用户是否想查看文件内容 read -p "Do you want to see the file just edited (y/n)?" if [ "$REPLY" = 'y' -o "$REPLY"='Y' -o "$REPLY"="Yes" ] then echoecho "Opening the file using '${PAGER:-less}'..."sleep 3#显示文件内容,如果变量PAGER为空就使用less${PAGER:-less} "$TARGET_FILE" fi echo echo "Bye!" echo else echo echo "File $TARGET_FILE can not be accessed,Please specify a Readable and Writable file." echo echo "Bye!" echo exit 1fi exit 0
脚本有点复杂
通过通配符来实现文件名替换,如?,*,[a-b],[^ab],[!ab]。
案例:
#!/bin/bash#临时目录TMPDIR=globbing#创建临时目录mkdir $TMPDIRcd $TMPDIR#创建一些文件来显示通配符匹配touch a.txt b.txt c.txtcount=1while [ "$count" -le 4 ]do touch "tmpfile.$count" let count+=1 echo "$count"doneecho#使用通配符显示文件echo "OUTPUT from ls *:"ls *echoecho "OUTPUT from ls ?.txt"#显示文件名以txt结束的文件ls ?.txtechoecho "OUTPUT from ls [ab]*"#显示文件名以字母a或b起始的文件ls [ab]*echo echo "OUTPUT from ls [^ab]*"#显示文件名不以字母a或b起始的文件ls [^ab]*echo echo "OUTPUT from ls [!ab]*"#显示文件名不以字母a或b起始的文件ls [!ab]*echo echo "OUTPUT from tmpfile.[a-c]"#显示文件名以字母a或b或c起始的文件ls [a-c]*echo echo "OUTPUT from tmpfile.[1-4]"#显示文件名以数字1或2或3或4结尾的文件ls tmpfile.[1-4]#返回之前的目录cd ->/dev/null #清除临时目录echoecho "Clean up tmp dir"rm -rf $TMPDIRexit 0
shell支持如下几种通配符:
wildcard | Description |
* | 匹配0或多个任意的字符 |
? | 匹配一个任意字符 |
[] | 匹配指定字符范围的任意一个字符 |
注意:
1 通配符*不会匹配隐藏的文件。
2~/[.]bashrc和~/?bashrc及~/*bashrc都不能扩展为主目录下的.bashrc文件,此时需要明确地写出第一个字符是点。
命令替换:当一个命令中引用另一个命令的输出时,就会用到命令替换。
命令替换的格式:
$(commands) 推荐使用,可读性和嵌套性更好
或
`commands`
通过算术运算可以计算一些算术表达式,并用计算得到的结果替换原来的表达式。
算术运算替换的格式:
$((exPRession))
注意:
1 $(())只能进行整数运算,结果中的小数部分都会忽略。
2 let命令的算术表达式不能包含任何空格。
新闻热点
疑难解答