1. 变量替换的高级形式
在变量名前面添加$可以引用变量的值。若此时变量没有被定义或变量的值为空,则使用$符号进行变量替换会得到一个空的字符串。而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: OPTION
do
case "$OPTION" in
f)
#每一个选项的参数可以使用变量$OPTARG来访问
TARGET_FILE="$OPTARG";;
e)
EDITOR="$OPTARG";;
p)
PAGER="$OPTARG";;
\?)
#当遇到未知选项时,显示脚本的使用方法
help;;
esac
done
#文件参数必须被设置
if [ -z "$TARGET_FILE" ]
then
help
fi
echo
#确保文件是可读、可写的
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
echo
echo "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
echo
echo "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 1
fi
exit 0
脚本有点复杂
2. 文件名替换
通过通配符来实现文件名替换,如?,*,[a-b],[^ab],[!ab]。
案例:
#!/bin/bash
#临时目录
TMPDIR=globbing
#创建临时目录
mkdir $TMPDIR
cd $TMPDIR
#创建一些文件来显示通配符匹配
touch a.txt b.txt c.txt
count=1
while [ "$count" -le 4 ]
do
touch "tmpfile.$count"
let count+=1
echo "$count"
done
echo
#使用通配符显示文件
echo "OUTPUT from ls *:"
ls *
echo
echo "OUTPUT from ls ?.txt"
#显示文件名以txt结束的文件
ls ?.txt
echo
echo "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
#清除临时目录
echo
echo "Clean up tmp dir"
rm -rf $TMPDIR
exit 0
shell支持如下几种通配符:
wildcard | Description |
* | 匹配0或多个任意的字符 |
? | 匹配一个任意字符 |
[] | 匹配指定字符范围的任意一个字符 |
注意:
1 通配符*不会匹配隐藏的文件。
2~/[.]bashrc和~/?bashrc及~/*bashrc都不能扩展为主目录下的.bashrc文件,此时需要明确地写出第一个字符是点。
3. 命令替换
命令替换:当一个命令中引用另一个命令的输出时,就会用到命令替换。
命令替换的格式:
$(commands) 推荐使用,可读性和嵌套性更好
或
`commands`
4. 算术运算替换
通过算术运算可以计算一些算术表达式,并用计算得到的结果替换原来的表达式。
算术运算替换的格式:
$((expression))
注意:
1 $(())只能进行整数运算,结果中的小数部分都会忽略。
2 let命令的算术表达式不能包含任何空格。