随机生成数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