一、Shell基本语法 文件名代换
用于匹配的字符称为通配符(Wildcard),如:* ? [ ] 具体如下:
*: 匹配0个或多个任意字符 ?:匹配一个任意字符 [ ]:匹配方括号中任意一个字符的一次出现代换成功的前提是文件必须存在,如果文件不存在,则带换不了。
参数扩展:
touch {1, 2, 3, 4} / touch{1..4}.txt命令代换
执行某一条命令,将这个命令的标准输出的内容存到某个变量中。
varname=cmd arg1 arg2 ... varname=$(date)
#!/bin/bash DateTime=`date`echo "DateTime is " $DateTime获取当前脚本所在路径:
#获取当前脚本所在路径 ,在这个路径touch一个1.txtcurPath=$(cd `dirname $0`;pwd)touch $curPath/1.txt算术代换
做最基本的整数运算
var=45var2=2echo $[var+3]echo $((var+3))echo $((var*var2))echo $(($var*$var2))# 将10以八进制来解析,最后得到的是10进制的8,最后再加11等于19echo $[8#10+11]转义字符
和C语言类似,\在Shell中被用作转义字符,用于去除紧跟其后的单个字符的特殊意义(回车除外),换句话说,紧跟其后的字符取字面值。例如:
引号单引号:
和C语言不同,Shell脚本中的单引号和双引号都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号。如果引号没有配对就输入回车,Shell会给出续行提示符,要求用户把引号配上对。例如:
双引号:
被双引号括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。这点与单引号的处理方式不同。
当我们使用变量之前,如果变量是作为一个参数来传递的,应该习惯性的加双引号,防止变量中有空格。
二、Shell脚本语法 条件测试
shell中如何表示真假?直接使用某条命令的返回状态来判断真假——main函数的返回值 。我们知道,在main函数中,0表示正常返回,非0表示非正常返回。跟C语言是相反的。
我们可以通过$?,来获取上一条命令的返回状态。
条件测试的命令: test 表达式 / [ 表达式 ]
( EXPRESSION ) 测试该表达式是否为真! EXPRESSION 取反EXPRESSION1 -a EXPRESSION2 逻辑与EXPRESSION1 -o EXPRESSION2 逻辑或-n STRING 判断字符串不是空串-z STRING 判断字符串长度为0STRING1 = STRING2 判断字符串相等STRING1 != STRING2 判断字符串不等INTEGER1 -eq INTEGER2 判断整数相等INTEGER1 -ge INTEGER2 判断整数1>=整数2INTEGER1 -gt INTEGER2 判断整数1>整数2INTEGER1 -le INTEGER2 判断整数1<=整数2INTEGER1 -lt INTEGER2 判断整数1<整数2INTEGER1 -ne INTEGER2 判断整数1!=整数2FILE1 -nt FILE2 判断文件1比文件2新(指最后修改时间)FILE1 -ot FILE2 判断文件1比文件2旧-b FILE 块设备-c FILE 字符设备-d FILE 判断是否目录-e FILE 单纯判断文件是否存在-f FILE 判断文件是一个普通文件-h FILE / -L FILE 判断是否一个符号链接-k FILE 判断文件的粘着位是否被设置-p FILE 判断文件是否是一个命名管道-r FILE 判断文件是否有读权限-s FILE 判断文件存在并且大小大于0字节-S FILE 判断文件是否是一个socket文件-t FD 判断某个文件描述符被终端打开-w FILE 判断是否有写权限-x FILE 有执行权限分支结构
和C语言类似,在Shell中用if、then、elif、else、fi这几条命令实现分支控制。
#!/bin/bashif [ -f /bin/bash ] # 判断bash文件是不是一个普通文件then echo "/bin/bash is a file"else echo "/bin/bash is NOT a file"fi“:”是一个特殊的命令,称为空命令,该命令不做任何事,但Exit Status总是真。
#!/bin/bashif falsethen: elseecho "always false"fi #!/bin/bashecho "Is it morning? Please answer yes or no!"#读取用户输入的一个变量read YES_OR_NOif [ "$YES_OR_NO" = "yes" ]thenecho "Good morning"elif [ "$YES_OR_NO" = "no" ] ; thenecho "Good afternoon"elseecho "Not recognized":fi除此之外,Shell还提供了&&和||语法,和C语言类似,具有Short-circuit特性。
分支结构:
case 表达式 inval1|pattern1)xxxxxx;;val2|pattern2)xxxxxx;;*)xxxx;;esac #将case倒着写 #!/bin/bashecho "Is it morning? Please answer yes or no!"#读取用户输入的一个变量read YES_OR_NOcase "$YES_OR_NO" inyes|y|Yes|YES)echo "Good morning";;[nN][oO])echo "Good afternoon";;*)echo "Not recognized";;esac循环
for循环的遍历方式:
for varname in 列表 ; do #do可以单独写一行,如果写在for这一样就要分号.....echo $varnamedone控制循环次数for i in {1..100}do...done遍历目录for i in `ls`do....done for FRUIT in apple banana peardo echo "I like $FRUIT"done # 计算从1加到100的值,使用for循环sum=0for i in {1..100}do sum=$[$sum+$i]doneecho $sum # 遍历当前目录,看当前目录中的普通文件和目录for f in `ls`do if [ -f "$f" ]thenecho "$f 是一个文件"elif [ -d "$f" ]then echo "$f 是一个目录"else echo "Not recognized"fidonewhile循环的遍历方式
while 命令|条件测试doxxxxdonebreak 和 continue 跟C中的一样 echo "Please input paswd"sum=1read trywhile [ "$try" != "secret" ]do if [ "$sum" -ge 5 ]then echo"Error 5 times, exit"breakfi echo "Sorry, try again!"read try sum=$[$sum+1]done三、总结
Shell就是命令行工具的胶水,没有任何语言能像Shell一样方便地将一大堆命令行工具组合起来。原则上来说,Shell做什么都可以,但显然它最适合的是自动化,因为只需要将你原来手动敲的命令都复制到一个文件里面就行了。好了,我们下期见!