生成范围为: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等于
举例:
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 #创建用户名文档while后面加一个:表示无限循环 while格式
while condition do command done举例:
while循环 i=0 #设置变量 while [ $i -le 10] #设置判断条件 do echo $i #输出变量 let i++ #每执行一次就加1 done进阶演示
#!/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 #判断结束语法格式
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命令: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 done0=第一个数值 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举例比大小
#!/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举例:区间判断
#!/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显示普通字符
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 #垂直制表符语法:
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位小数。
语法
[ function ] funname [()] { action; [return int;] }举例:
hans(){ #自定义函数名称 read -p "第一个数:" a read -p "请输入运算符:" c read -p "第二个数:" b return $(( $a$c$b )) } hans #执行那个函数 echo "输入的两个数字之和为 $? !" #显示上一次执行结果/dev/null 是linux的黑洞设备
参数:
常用选项见表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