shell笔记:语法笔记

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

猜你喜欢

转载自blog.csdn.net/weixin_47768822/article/details/109222333