首页 > 学院 > 开发设计 > 正文

第8章 替换

2019-11-08 18:22:16
字体:
来源:转载
供稿:网友

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: 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

 脚本有点复杂

2.     文件名替换

通过通配符来实现文件名替换,如?,*,[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文件,此时需要明确地写出第一个字符是点。

3.     命令替换

命令替换:当一个命令中引用另一个命令的输出时,就会用到命令替换。

命令替换的格式:

 $(commands)  推荐使用,可读性和嵌套性更好

 或

 `commands`

4.     算术运算替换

通过算术运算可以计算一些算术表达式,并用计算得到的结果替换原来的表达式。

算术运算替换的格式:

 $((exPRession))

 

注意:

 1  $(())只能进行整数运算,结果中的小数部分都会忽略。

 2  let命令的算术表达式不能包含任何空格。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表