shell笔记:语法笔记

it2026-01-06  8

随机生成数RANDOM

生成范围为:0-32767 比大小符号 运算符 说明 举例

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

本人速记方法 g大 l小 e等于

1:for循环

举例:

for 变量 in 变量范围 #设置变量范围(有几个变量就会循环执行几次) do 引用变量的程序体 done

实战举例1 计算1+2+3+…+100=?

name=0 for i in {1..100} #定义循环 do #循环开始 sum=$(($sum+$i)) #需要循环的命令 done #循环结束 echo $sum #输出循环结果

实战举例2 批量添加用户并设置密码 创建一个用户名文件 1:用户名自定义,密码相同

touch /root/sh/1.txt #创建用户名文档

2:while 循环

while后面加一个:表示无限循环 while格式

while condition do command done

举例:

while循环 i=0 #设置变量 while [ $i -le 10] #设置判断条件 do echo $i #输出变量 let i++ #每执行一次就加1 done

3:case多选语句

#!/bin/bash #解释器 read -p"输入 1 到 4 之间的数字:" aNum #获取变量 echo '你输入的数字为:$aNum' case $aNum in #进行选择判断 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac #结束选择判断

进阶演示

#!/bin/bash language=$1 #传参引用第一个参数 case $language in #进行判断 en|english|55) echo "Hello World" ;; fr) echo "Allo Monde" ;; es) echo "Hola Mundo" ;; *) echo "I don't understand you..." ;; esac #判断结束

4:if条件判断

语法格式

if [ 条件 ] then #成功则执行 多行程序体 elif #上一个不成功则执行 多行程序体 else #上面全不成功则执行 多行程序体 fi

举例:

#!/bin/bash a=10 b=20 if [ $a == $b ] #判断 a 是否等于 b then echo "a 等于 b" elif [ $a -gt $b ] then echo "a 大于 b" elif [ $a -lt $b ] then echo "a 小于 b" else echo "没有符合的条件" fi

5:跳出循环

命令:break和continue break跳出所有循环 continue跳出当前循环 举例:

#!/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

6:数组

0=第一个数值 1=第二个数值 2=以此类推

数值之间要有空格隔断 格式:数组名=(数值1 数值2 … 数值n) 举例: 1:

array_name=(value0 value1 value2 value3)

2:

array_name=( value0 value1 value2 value3 )

脚本举例: 1:读取数组

#!/bin/bash my_array=(A B C D) echo "第一个元素为: ${my_array[0]}" echo "第二个元素为: ${my_array[1]}" echo "第三个元素为: ${my_array[2]}" echo "第四个元素为: ${my_array[3]}"

2:读取数组里使用元素

#!/bin/bash echo "数组的元素为: ${my_array[*]}" echo "数组的元素为: ${my_array[@]}"

3:读取数组长度

echo "数组元素个数为: ${#my_array[*]}" echo "数组元素个数为: ${#my_array[@]}"

实战:创建多个用户并指定密码

#!/bin/bash cd / user=('cat user') passwd=('cat passwd') for i in {0..5} do useradd ${user[$i]} -p ${passwd[$i]} done

7:运算符号

echo ` expr 15 + 5 ` #加法 echo ` expr 15 - 5 ` #减法 echo ` expr 15 \* 5 ` #乘法 echo ` expr 15 / 5 ` #除法

举例比大小

#!/bin/bash read -p "输入第一个数" a read -p "输入第二个数" b if [ $a -eq $b ];then echo "$a = $b" elif [ $a -gt $b ];then echo "$a > $b" elif [ $a -lt $b ];then echo "$a < $b" else echo "请输入整数" fi

8:布尔运算

运算符 说明 举例 ! 非运算,表达式为true则返回false,否则返回true。 [ ! false ] 返回true。 -o 或运算,有一个表达式为true(正确) 则返回 true(正确)。 [ $a -lt 20 -o $b -gt 100 ] 返回true。 -a 与运算,两个表达式都为true(正确)才返回true(正确)。 [ $a -lt 20 -a $b -gt 100 ] 返回false。

举例:区间判断

#!/bin/bash read -p "输入一个0到100之间的整数: " a if [ $a -ge 0 -a $a -lt 25 ];then echo "它在第一区间(0-50)" elif [ $a -ge 25 -a $a -lt 50 ];then echo "它在第二区间(25-50)" elif [ $a -ge 50 -a $a -lt 75 ];then echo "它在第三区间(50-75)" elif [ $a -ge 75 -a $a -lt 100 ];then echo "它在第四区间(75-100)" elif [ $a -lt 0 ];then echo "你输入的数小于0,请重新输入" elif [ $a -gt 100 ];then echo "你输入的数大于100,请重新输入" else echo "请输入0到100之间的整数" fi

9:运算符

运算符 说明 举例 = 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。 != 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。 -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回false。 -n 检测字符串长度是否为0,不为0返回 true。 [ -n $a ] 返回true。 str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回true。

10:文件测试

操作符 说明 举例 -b file 检测文件是否是块设备文件,如果是,则返回true。 [ -b $file ] 返回 false。 -c file 检测文件是否是字符设备文件,如果是,则返回true。 [ -c $file ] 返回 false。 -d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。 -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回true。 [ -f $file ] 返回 true。 -g file 检测文件是否设置了 SGID 位,如果是,则返回true。 [ -g $file ] 返回 false。 -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回true。 [ -k $file ] 返回 false。 -p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。 -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。 -r file 检测文件是否可读,如果是,则返回true。 [ -r $file ] 返回 true。 -w file 检测文件是否可写,如果是,则返回true。 [ -w $file ] 返回 true。 -x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。 -s file 检测文件是否为空(文件大小是否大于0),不为空返回true。 [ -s $file ] 返回 true。 -e file 检测文件(包括目录)是否存在,如果是,则返回true。 [ -e $file ] 返回 true。

10:echo转义字符

显示普通字符

echo "hello" 显示:hello echo hello 显示:hello echo ""\hello\"" 显示:"hello" #!/bin/sh echo -e "OK! \n" # -e 开启转义 \n换行 echo "It it a test"

转义符号扩展

转义字符 含义 \\ #反斜杠 \a #警报,响铃 \b #退格(删除键) \f #换页(FF),将当前位置移到下页开头 \n #换行 \c #不换行 \r #回车 \t #水平制表符(tab键) \v #垂直制表符

11:printf格式化输出

语法:

printf format-string [arguments...]

参数说明: format-string:为格式控制字符串 arguments:为参数列表。

printf "Hello, Shell\n"

格式替代符

%b 相对应的参数被视为含有要被处理的转义序列之字符串。 %c ASCII字符。显示相对应参数的第一个字符 %d, %i 十进制整数 %e, %E, %f 浮点格式 %g %e或%f转换,看哪一个较短,则删除结尾的零 %G %E或%f转换,看哪一个较短,则删除结尾的零 %o 不带正负号的八进制值 %s 字符串 %u 不带正负号的十进制值 %x 不带正负号的十六进制值,使用a至f表示10至15 %X 不带正负号的十六进制值,使用A至F表示10至15 %% 字面意义的%

printf转义序列

\a 警告字符,通常为ASCII的BEL字符 \b 后退 \c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略。 \f 换页(formfeed) \n 换行 \r 回车(Carriage return) \t 水平制表符 \v 垂直制表符 \\ 一个字面上的反斜杠字符 \ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效 \0ddd 表示1到3位的八进制值字符

举例:

#!/bin/bash printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876

执行脚本,输出结果如下所示:

姓名 性别 体重kg 郭靖 男 66.12 杨过 男 48.65 郭芙 女 47.99

%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。 %-4.2f 指格式化为小数,其中2指保留2位小数。

12:函数

语法

[ function ] funname [()] { action; [return int;] }

举例:

hans(){ #自定义函数名称 read -p "第一个数:" a read -p "请输入运算符:" c read -p "第二个数:" b return $(( $a$c$b )) } hans #执行那个函数 echo "输入的两个数字之和为 $? !" #显示上一次执行结果

13:重定向

command > file 将输出重定向到file command < file 将输入重定向到file command >> file 将输出以追加的方式重定向到file n> file 将文件描述符为n的文件重定向到file n >> file 将文件描述符为n的文件以追加的方式重定向到file n > & m 将输出文件m和n合并 n < $ m 将输入文件m和n合并

/dev/null 是linux的黑洞设备

14:sed命令

参数:

常用选项见表11-1 -n 使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上,但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来 -e 直接在指令列模式上进行 sed 的动作编辑 -f 直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作; -r sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法) -i 直接修改读取的档案内容,而不是由萤幕输出。 a 新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行) c 取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行 d 删除,因为是删除啊,所以 d 后面通常不接任何东西 i 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行) p 列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作 s 取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法

举例:

(1)删除某行

#删除第一行 sed '1d' test.txt #删除最后一行 sed '$d' test.txt #删除第一行到第二行 sed '1,2d' test.txt

(2)显示某行

#显示第一行 [root@bogon z3]# sed -n '1p' test.txt #显示最后一行 [root@bogon z3]# sed -n '$p' test.txt #显示第一行到第二行 [root@bogon z3]# sed -n '1,2p' test.txt

(3)使用模式进行查询

#查询包括关键字ruby所在所有行 sed -n '/ruby/p' test.txt #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义 sed -n '/\$/p' test.txt

(4)增加一行或多行字符串

cat test.txt Hello! ruby is me,welcome to my blog. End #第一行后增加字符串"drink tea" sed '1a drink tea' test.txt Hello! drink tea ruby is me,welcome to my blog. End #第一行到第三行后增加字符串"drink tea" sed '1,3a drink tea' test.txt Hello! drink tea ruby is me,welcome to my blog. drink tea end drink tea #第一行后增加多行,使用换行符\n sed '1a drink tea\nor coffee' test.txt Hello! drink tea or coffee ruby is me,welcome to my blog. end

(5)代替一行或多行

#第一行代替为Hi sed '1c Hi' test.txt Hi ruby is me,welcome to my blog. End #第一行到第二行代替为Hi sed '1,2c Hi' test.txt Hi end

(6)替换一行中的某部分 格式:sed ‘s/要替换的字符串/新的字符串/g’ (要替换的字符串可以用正则表达式)

#替换ruby为bird [root@bogon z3]# sed -n '/ruby/p' test.txt | sed 's/ruby/bird/g' #删除ruby [root@bogon z3]# sed -n '/ruby/p' test.txt | sed 's/ruby//g'

(7)插入

#在文件test.txt中最后一行直接输入"bye" [root@bogon z3]# sed -i '$a bye' test.txt [root@bogon z3]# cat test.txt Hello ruby is me,welcome to my blog. end bye

(8)删除文档中匹配行

sed -i '/匹配字符串/d' filename

(9)替换匹配行中的某个字符串

sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename
最新回复(0)