💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## shell脚本 Shell 脚本(shell script),是一种为 shell 编写的脚本程序。 **简单的shell脚本** ~~~ #!/bin/bash echo "Hello World !" ~~~ **运行shell脚本的两种方法** 1. 作为可执行程序 ~~~ chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本 ~~~ 2. 作为解析器参数 ~~~ /bin/sh test.sh /bin/php test.php ~~~ **shell 变量** >[danger]变量命名规则: >* 变量名和等号之间不能有空格 >*命名只能使用英文字母,数字或下划线,首个字符不能以数字开头 >* 中间不能有空格可以用下划线_ >*不能使用标点符号 >*不能使用bash里的关键字(可用help命令查看保留的关键字) 变量命名 ~~~ RUNOOB LD_LIBRARY_PATH _var var2 ~~~ **使用shell变量** ~~~ your_name="qinjx" echo $your_name echo ${your_name} ~~~ **shell中的只读变量** ~~~ #!bin/sh my_name="shell" readonly my_name my_name="shell_test" [root@mini2 shell]# sh testdo.sh testdo.sh: line 4: my_name: readonly variable ~~~ **shell中删除变量** 变量被删除后不能再次使用。unset 命令不能删除只读变量。 ~~~ #!/bin/sh my_name="shell" unset my_name echo $my_name ~~~ **shell字符串** >[success] 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的; 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。 1. 单引号 ~~~ #!/bin/sh str='this is str' echo $str ~~~ 2. 双引号 ~~~ #!/bin/sh my_name='shell' str="I study $my_name" echo $str ~~~ **shell中的字符串拼接** ~~~ [root@mini2 shell]# vi testdo.sh #!bin/sh my_name="shell" str="Hello,"$my_name"!" echo $str str1="Hello,${my_name}!" echo $str1 my_name1='shell_study' str2='hello,'$my_name1'!' echo $str2 str3='hello,${my_name1}!' echo $str3 [root@mini2 shell]# sh testdo.sh Hello,shell! Hello,shell! hello,shell_study! hello,${my_name1}! ~~~ **shell中获取字符串的长度** ~~~ #!bin/sh str="abcd" echo ${#str} [root@mini2 shell]# sh testdo.sh 4 ~~~ **shell中提取子字符串** ~~~ [root@mini2 shell]# vi testdo.sh #!bin/sh str="abcd" echo ${str:1:2} [root@mini2 shell]# sh testdo.sh bc ~~~ **shell中查找子字符串** 查找i或c的位置(哪个字母先出现就计算出哪个) ~~~ [root@mini2 shell]# vi testdo.sh #!bin/sh str="where is abcd" echo `expr index "$str" ic` [root@mini2 shell]# sh testdo.sh 7 ~~~ **shell中的数组** ~~~ #定义数组 array=(value0 value1 value2) [root@mini2 shell]# vi testdo.sh #!bin/sh array=(value0 value1 value2) echo ${array[1]} #${数组名[下标]} echo ${array[@]} #使用@符号可以获取数组中所有元素 [root@mini2 shell]# sh testdo.sh value1 value0 value1 value2 ~~~ **获取数组的长度** ~~~ [root@mini2 shell]# vi testdo.sh #!bin/sh array=(value0 value1 value2) length=${#array[@]} #获取数组的长度 length1=${#array[*]} #获取数组的长度 length2=${#array[1]} #获取数组中某个元素的长度 echo $length $length1 $length2 [root@mini2 shell]# sh testdo.sh 3 3 6 ~~~ **shell中的注释** 1. 单行注释 以"#"开头的行就是注释,会被解释器忽略 2. 多行注释 ~~~ [root@mini2 shell]# vi testdo.sh #!bin/sh :<<EOF 这是多行注释 这是多行注释 EOF 或者 [root@mini2 shell]# vi testdo.sh #!bin/sh :<<! 这是多行注释 这是多行注释 ! ~~~ **shell中传递参数** ~~~ #!bin/sh echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1"; echo "第二个参数为:$2"; echo "第三个参数为:$3"; [root@mini2 shell]# chmod +x testdo.sh [root@mini2 shell]# sh testdo.sh 1 2 3 Shell 传递参数实例! 执行的文件名:testdo.sh 第一个参数为:1 第二个参数为:2 第三个参数为:3 ~~~ |参数 |说明| |--|--| |$# |传递到脚本的参数个数 |$*| 以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。| |$$ |脚本运行的当前进程ID号| |$! |后台运行的最后一个进程的ID号| |$@ |与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。| |$- |显示Shell使用的当前选项,与set命令功能相同。| |$? |显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。| ~~~ [root@mini2 shell]# vi testdo.sh #!bin/sh echo "Shell 传递参数实例!"; echo "第一个参数为:$1"; echo "参数个数为:$#"; echo "传递的参数作为一个字符串显示:$*"; [root@mini2 shell]# sh testdo.sh 1 2 3 Shell 传递参数实例! 第一个参数为:1 参数个数为:3 传递的参数作为一个字符串显示:1 2 3 ~~~ >[danger]$* 与 $@ 区别: 相同点:都是引用所有参数。 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。 ~~~ #!/bin/bash echo "-- \$* 演示 ---" for i in "$*"; do echo $i done echo "-- \$@ 演示 ---" for i in "$@"; do echo $i done #执行脚本,输出结果如下所示: $ chmod +x test.sh $ ./test.sh 1 2 3 -- $* 演示 --- 1 2 3 -- $@ 演示 --- 1 2 3 ~~~ **shell中运算符** Shell 和其他编程语言一样,支持多种运算符,包括: * 算数运算符 * 关系运算符 * 布尔运算符 * 字符串运算符 * 文件测试运算符 > expr 是一款表达式计算工具,使用它能完成表达式的求值操作。 ~~~ [root@mini2 shell]# vi testdo.sh #!bin/sh val=`expr 2 + 2` echo "两数之和为:$val" [root@mini2 shell]# sh testdo.sh 两数之和为:4 ~~~ 1. 算术运算符 下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20: | 运算符 |说明| 举例| |--|--|--| | +| 加法| `expr $a + $b` 结果为 30。| |-| 减法 |`expr $a - $b` 结果为 -10。| |*| 乘法| `expr $a \* $b` 结果为 200。| |/ |除法| `expr $b / $a` 结果为 2。| |%| 取余| `expr $b % $a` 结果为 0。| |=| 赋值 |a=$b 将把变量 b 的值赋给 a。| |==| 相等。|用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。| |!= |不相等。|用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。| 注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。 ~~~ [root@mini2 shell]# vi testdo.sh val=`expr 2 + 2` #!bin/sh a=10 b=20 val=`expr $a + $b` echo "a + b : $val" val=`expr $a - $b` echo "a - b : $val" val=`expr $a \* $b` echo "a * b : $val" val=`expr $b / $a` echo "b / a : $val" val=`expr $b % $a` echo "b % a : $val" if [ $a == $b ] then echo "a 等于 b" fi if [ $a != $b ] then echo "a 不等于 b" fi ~ "testdo.sh" 27L, 309C written [root@mini2 shell]# sh testdo.sh a + b : 30 a - b : -10 a * b : 200 b / a : 2 b % a : 0 a 不等于 b #计算(2+3) X 4 [root@mini2 shell]# echo `expr \`expr 2 + 3\` \* 4` 或 $(((2+3)*4)) ~~~ 2. 关系运算符 关系运算符只支持数字,不支持字符串,除非字符串的值是数字。 下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20: | 运算符| 说明 | 举例| |--|--|--| | -eq| 检测两个数是否相等,相等返回 true。| [ $a -eq $b ] 返回 false。| | -ne| 检测两个数是否不相等,不相等返回 true。| [ $a -ne $b ] 返回 true。| | -gt |检测左边的数是否大于右边的,如果是,则返回 true。| [ $a -gt $b ] 返回 false。| | -lt| 检测左边的数是否小于右边的,如果是,则返回 true。| [ $a -lt $b ] 返回 true。| | -ge| 检测左边的数是否大于等于右边的,如果是,则返回 true。| [ $a -ge $b ] 返回 false。| | -le| 检测左边的数是否小于等于右边的,如果是,则返回 true。| [ $a -le $b ] 返回 true。| ~~~ [root@mini2 shell]# vi testdo.sh #!/bin/sh a=10 b=20 if [ $a -eq $b ] then echo "$a -eq $b : a 等于 b" else echo "$a -eq $b: a 不等于 b" fi if [ $a -ne $b ] then echo "$a -ne $b: a 不等于 b" else echo "$a -ne $b : a 等于 b" fi if [ $a -gt $b ] then echo "$a -gt $b: a 大于 b" else echo "$a -gt $b: a 不大于 b" fi if [ $a -lt $b ] then echo "$a -lt $b: a 小于 b" else echo "$a -lt $b: a 不小于 b" fi [root@mini2 shell]# sh testdo.sh 10 -eq 20: a 不等于 b 10 -ne 20: a 不等于 b 10 -gt 20: a 不大于 b 10 -lt 20: a 小于 b 10 -ge 20: a 小于 b 10 -le 20: a 小于或等于 b ~~~ **shell中的for循环** 第一种: ~~~ for N in 1 2 3 do echo $N done 或者写成一行: for N in 1 2 3;do echo $N;done 或者 for N in {1,2,3};do echo $N;done [root@mini2 shell]# vi testdo.sh #!/bin/sh for N in $* do echo $N done [root@mini2 shell]# sh testdo.sh 1 2 3 1 2 3 ~~~ 第二种: ~~~ for ((i=0;i<=5;i++)) do echo "welcome $i" done 或者 [root@mini2 shell]# for ((i=0;i<=5;i++));do echo "welcome $i";done ~~~ **shell中的while循环** ~~~ #!/bin/sh int=1 while(( $int<=5 )) do echo $int let int++ #或者 加上双引号“int++” done [root@mini2 shell]# sh testdo.sh 1 2 3 4 5 ~~~ **shell中的until循环** >[danger]until 循环执行一系列命令直至条件为 true 时停止。 >until 循环与 while 循环在处理方式上刚好相反。 >一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。 ~~~ [root@mini2 shell]# vi testdo.sh #!/bin/sh a=0 until [ ! $a -lt 10 ] #不小于10的情况下执行 do echo $a a=`expr $a + 1` done [root@mini2 shell]# sh testdo.sh 0 1 2 3 4 5 6 7 8 9 ~~~ **shell中的case** ~~~ [root@mini2 shell]# vi testdo.sh #!/usr/bin echo "输入1到2之间的数字" echo '你输入的数字为' read aNum case $aNum in 1) echo '你选择了1' ;; 2) echo '你选择了2' ;; *) echo '你没有输入1-2之间的数字' ;; esac [root@mini2 shell]# sh testdo.sh 输入1到2之间的数字 你输入的数字为 1 你选择了1 [root@mini2 shell]# sh testdo.sh 输入1到2之间的数字 你输入的数字为 2 你选择了2 [root@mini2 shell]# sh testdo.sh 输入1到2之间的数字 你输入的数字为 3 你没有输入1-2之间的数 ~~~ **shell中的if** 第一种: ~~~ [root@mini2 shell]# vi testdo.sh #!/usr/bin echo '你输入的数字为' read aNum if(( $aNum<2 )) then echo "小于2" elif(( $aNum==2 )) then echo "等于2" else echo "大于2" fi [root@mini2 shell]# sh testdo.sh 你输入的数字为 1 小于2 [root@mini2 shell]# sh testdo.sh 你输入的数字为 2 等于2 [root@mini2 shell]# sh testdo.sh 你输入的数字为 3 大于2 [root@mini2 shell]# ~~~ 第二种: ~~~ #!/usr/bin echo '你输入的数字为' read aNum if [ $aNum -lt 2 ] then echo "小于2" elif [ $aNum -eq 2 ] then echo "等于2" elif [ $aNum -gt 2 ] then echo "大于2" fi [root@mini2 shell]# sh testdo.sh 你输入的数字为 1 小于2 [root@mini2 shell]# sh testdo.sh 你输入的数字为 2 等于2 [root@mini2 shell]# sh testdo.sh 你输入的数字为 3 大于2 [root@mini2 shell]# ~~~ **shell中的跳出循环** 1. break命令 break命令允许跳出所有循环(终止执行后面的所有循环)。 ~~~ #!/bin/bash while : do echo -n "输入 1 到 5 之间的数字:" read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束" break ;; esac done 执行以上代码,输出结果为: 输入 1 到 5 之间的数字:3 你输入的数字为 3! 输入 1 到 5 之间的数字:7 你输入的数字不是 1 到 5 之间的! 游戏结束 ~~~ 2. continue continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。 ~~~ #!/bin/bash while : do echo -n "输入 1 到 5 之间的数字: " read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的!" continue echo "游戏结束" ;; esac done ~~~