1、双引号与单引号的使用 要输出的信息中有单引号则用双引号将数据包含起来,输出的信息中有双引号则用单引号将数据包含起来。
$ echo 'Rich says "scripting is easy".' Rich says "scripting is easy". $ echo "Rich says 'scripting is easy'." Rich says 'scripting is easy'.2、shell脚本中的比较符号 shell中使用符号“$?”来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败。 结合if-else语句实现判断上一个命令是否执行成功。 示例如下:
if [ $? -ne 0 ]; then echo "failed"else echo "succeed"fi 或者: if [ $? -eq 0 ]; then echo "succeed"else echo "failed"fi -eq 等于 -ne 不等于 -gt 大于 -lt 小于 ge 大于等于 le 小于等于3、有时候变量名很容易与其他文字混淆,比如:
num=2 echo "this is the $numnd"这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:
num=2 echo "this is the ${num}nd" 这将打印: this is the 2nd4、使用tee命令可以将管道的东西写进文件 下面举个例子就可以看出tee的作用了: tee -a file 将标准输出追加到文件末尾,而不会覆盖file 5、shell脚本中的条件测试if中的-z到-d的意思 [ -a FILE ] 如果 FILE 存在则为真。 [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。 [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。 [ -d FILE ] 如果 FILE 存在且是一个目录则为真。 [ -e FILE ] 如果 FILE 存在则为真。 [ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。 [ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。 [ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。 [ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。 [ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。 [ -r FILE ] 如果 FILE 存在且是可读的则为真。 [ -s FILE ] 如果 FILE 存在且大小不为0则为真。 [ -t FD ] 如果 文件描述符 FD 打开且指向一个终端则为真。 [ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。 [ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。 [ -x FILE ] 如果 FILE 存在且是可执行的则为真。 [ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。 [ -G FILE ] 如果 FILE 存在且属有效用户组则为真。 [ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。 [ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。 [ -S FILE ] 如果 FILE 存在且是一个套接字则为真。 [ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。 [ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。 [ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。 [ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。 [ -z STRING ] “STRING” 的长度为零则为真。 字符串为空即NULL时为真。 [ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。加-n与不加-n结果相同。 [ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。 [ STRING1 != STRING2 ] 如果字符串不相等则为真。 [ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。 [ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。
-eq 等于,如:if ["$a" -eq "$b" ] -ne 不等于,如:if ["$a" -ne "$b" ] -gt 大于,如:if ["$a" -gt "$b" ] -ge 大于等于,如:if ["$a" -ge "$b" ] -lt 小于,如:if ["$a" -lt "$b" ] -le 小于等于,如:if ["$a" -le "$b" ] < 小于(需要双括号),如:(("$a" < "$b")) <= 小于等于(需要双括号),如:(("$a" <= "$b")) > 大于(需要双括号),如:(("$a" > "$b")) >= 大于等于(需要双括号),如:(("$a" >= "$b"))
6、常用变量含义 $0 这个程式的执行名字 $n 这个程式的第n个参数值,n=1..9 $(n) 这个是个表示传入参数超过9个参数的情况下需要用“$(n)”的格式获取参数,比如传入第10个参数“$(10)” $* 这个程式的所有参数,此选项参数可超过9个。 $# 这个程式的参数个数 $$ 这个程式的PID(脚本运行的当前进程ID号) $! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号) $? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误) $- 显示shell使用的当前选项,与set命令功能相同 $@ 跟$*类似,但是可以当作数组用 s/$// 在每一行后面追加空. s为搜索 如s/a/b/ 搜索a 将替换为b ,并只替换一次. s/ *//g 将空格删除. g代表搜索到的全部替换 。“空格星”( " *") 代理多个空格 /^$/d 删除空行. 7、 exit(0):正常运行程序并退出程序; exit(1):非正常运行导致退出程序;
8、expr命令的作用 (1)提取指定字符的下标:expr index 内容 字符,例如:$ind=`expr index "$content" "="` (2)提取字符串的子串:expr substr 内容 起始位置 终点位置,例如:$con=`expr substr "$content" "1" $ind (3)expr也是一个手工命令行计数器。 $expr 10 + 10 20 9、“与$()在Shell脚本中都是用作命令代换的 10、EOF标示使用注意事项 这是 Here document 用法 EOF本意是 End Of File,表明到了文件末尾。 使用格式基本是这样的: 命令 << EOF 内容段 EOF 将“内容段”整个作为命令的输入。 使用时注意该标识前后不能有空格及其他符号
11、shell中如何将命令的执行结果赋值给变量 以获取当前登录linux用户来说,当前登录的用户为root
{ #!/bin/bash/ user=$(echo $USER) echo $user }以上脚本的执行结果为:root 所以获取命令执行结果并赋值给一个变量的命令格式为:var=$(command) 其中command为需要执行的命令
12、linux下截取文件目录中的文件名 示例:截取目录image下后缀为.tarok的文件名,有以下截取方式 1)、tardir=$(ls -1 $localpath/*.tarok) tarname=${image%%.*} ---从右边开始匹配第一个"."并去掉"."右边的所有字符,保留"."左边的内容 tarpath=${tarname##*/} ---从左边开始匹配最后一个"/"并去掉"/"左边的字符,保留"/"右边的内容 2)、使用awk命令 tardir=$(ls -1 $localpath/*.tarok | awk -F "/" '{print substr($NF,0,length($NF)-6)}')
13、shell脚本中怎样使用sed命令呢 平时在命令行中的话就是常规的使用方式:sed 's/test/test1/g' test.txt 在shell脚本中的话就得变一下:sed "s/test/test1/g" test.txt
