第8章 替换

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命令的算术表达式不能包含任何空格。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值