shell脚本学习笔记

    技术2025-11-17  18

    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 2nd

    4、使用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

    Processed: 0.011, SQL: 9