Shell脚本编程之常用命令3

原文链接: https://www.runoob.com/linux/linux-shell.html

代码中的[]执行基本的算数运算,如

#!/bin/bash
    a=5
    b=6

result=$[a+b] #注意等号两边不能有空格
echo "result : $result"

结果

result : 11

字符串测试

= 			等于则为真
!= 			不等于则为真
-z			字符串的长度为0则为真
-n			字符串的长度不为零则为真

实例演示

num1="ru1noob"
num2="runoob"
if test $num1 = $ num2
then
	echo '两个字符串相等!'
else
	echo'两个字符不相等'
fi

输出结果

两个字符不相等

文件测试

-e 文件名			如果文件存在则为真
-r 文件名			如果文件存在且可读则为真
-w 文件名			如果文件存在且可写则为真
-x 文件名			如果文件存在且可执行则为真
-s 文件名			如果文件存在且至少有一个字符串则为真
-d 文件名			如果文件存在且为目录则为真
-f 文件名			如果文件存在且为普通文件则为真
-c 文件名			如果文件存在且为字符型特殊则为真
-b 文件名			如果文件存在且为块特殊文件则为真

实例演示

cd /bin
if test -e ./bash
then 
	echo '文件已存在'
else
	echo '文件不存在'

输出结果

文件已存在

Shell还提 供与-a-o! 三个逻辑操作符用于将测试条件链接起来,其中‘!’的优先级最高

"-a"次之,"-o"最低。
cd /bin
if test -e ./notfile -o -e ./bash
then 
	echo "至少有一个文件存在!"
else
	echo "两个文件都不存在"
fi

输出结果:

至少有一个文件存在!

Shell 流程控制

if else格式
	
if
----------------------------------
if condition
then 
	command1
	command2
	command3
	command4
	...
	commandn
if

写成一行(适用于终端命令提示符):

if [ $(ps -ef | grep -c "ssh" -gt 1)]; then echo "true"; fi

if else 语法格式如下:

if condition
then 
	command1
	command2
	command3
	command4
	...
	commandn
else
	command 
if

if else-if else 语法格式

if condition1
then
	command1
elif conditon2
then 
	command2
else commandN
fi

判断两个变量是否相等

a=10
b=20

if [ $a == $b ]
then
	echo "a等于b"
elif [ $a -gt $b ]
then 
	echo "a大于b
elif  [ $a -gt $b ]
	echo "a 小于b"
fi 

输出结果

a 小于b

if else 语句经常和test语句结合使用

num1=$[2*3]
num2=$[1+5]

if test $[num1] -eq $[num2]
then 
	echo "两个数字相等"
else
	echo "两个数字不相等"
fi

输出结果

两个数字相等

for 循环

语法格式如下:

for var in item1 item2 ... itemN
do
	command1
	command2
	command3
	command4
	...
	commandn
done 

写成一行 for var item1 item2 ... itemN; do command1; command2; ... dene;
当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的Shell命令和语句。
in 列表可以包含替换,字符,和文件名
in 列表是可选的,如果不用它,for循环使用命令行的位置参数。

例如 顺序输出当前列表中的数字:

for loop in 1 2 3 4 5
do
	echo "The value is : $loop"
done 

输出结果

The value is : 1
The value is : 2
The value is : 3
The value is : 4
The value is : 5

顺序输出字符串中的字符

for str in 'this is a string'
do
	echo $str
done

输出结果:

this is a string

while

while 循环用于不断执行一系列命令,也用于从输入文件中读取数据,
命令通常为测试条件

while condition
do
	command
done

while的基本循环,测试条件是如果int小于等于5,那么条件返回真。
int从0开始,每次循环处理时,int加1.运行上述脚本,返回数组1到5,然后终止。

#!/bin/bash
int=1
while(($int<=5))
do
	echo $int
	let "int++"
done 

脚本运行,输出

1
2
3
4
5

上述实例采用Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上$表示变量

和C语言类似的

for((assignment;condition:next));do
    command_1;
    command_2;
    commond_..;
done;
#!/bin/bash
for((i=1;i<=5;i++));do
    echo "这是第 $i 次调用";
done;

输出结果

这是第 1 次调用
这是第 2 次调用
这是第 3 次调用
这是第 4 次调用
这是第 5 次调用

while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILE,按Ctrl+ D 结束循环。

echo '按下Ctrl+D退出'
echo -n '输入你最喜欢的网站名'
while read FILM
do
 echo "是的 $FILM是个好网站"
done
运行脚本输出结果类似
按下Ctrl+D退出
输入你最喜欢的网站名

输出结果

是的!菜鸟教程 是一个好网站

无限循环

while :
do
	command
done 

或者

while true
do
	command
done 

或者

for((;;))

until循环

循环执行一些列命令直到条件为true时停止。
until循环与while循环在处理方式上刚好相反。
一般while循环优先于until循环,但在某些时候也只是极少数的情况下until更加有用
until 语法格式

until condition
do 
	command
done
condition一般为条件表达式,如果返回值为false,则继续执行,否则跳出循环

输出数字0~9

#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
	echo $a
	a=`expr $a + 1`
done

运行结果:

0
1
2
3
4
5
6
7
8
9

case

case 语句为多选语句。可以用case语句匹配一个值和一个模式,如果匹配成功,执行相匹配的命令
语句格式如下:

case 值 in
模式1)
	command1
	command2
	...
	commandN
	;;
模式2)
	command1
	command2
	...
	commandN
	;;
easc

case 的工作方式如上 ,取值后面必须为单词in,每个模式必须以右括号结束。
取值可以为变量或常数,匹配发现取值符合某一模式之后,执行期间的所有命令直到;;。

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令之后就不再继续其他模式。
如果无一匹配模式,使用*捕获该值,再执行后面的命令。

下面的脚本提示输入1到4,与每一种模式惊喜匹配

echo '输入1到4之间的数'
echo '你输入的数字为'
read aNum
case $Num in
	1) echo '你选择1'
	;;
	2) echo '你选择2'
	;;
	3) echo '你选择3'
	;;
	4) echo '你选择4'
	;;
	*) echo '你没有输入1到4之间的数字'
	;;
esac

执行结果如下

输入的内容不同得到的结果也就不一样。
输入 1 到 4 之间的数字:
你输入的数字为:
3
你选择了 3

跳出循环的命令

在循环的过程中,有时候需要在未达到循环结束的条件之前强制跳出循环,
Shell命令有两个,break continue

break 命令 运行跳出循环(终止执行后面所有的所有循环)。

脚本进入死循环直至用户输入大于5.

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

执行基本的算数运算,如

sudo chmod +x test.sh
./test.sh

输入1到5之间的数字2
你输入的数字为 2!
输入1到5之间的数字4
你输入的数字为 4!
输入1到5之间的数字1
你输入的数字为 1!
输入1到5之间的数字2
你输入的数字为 2!
输入1到5之间的数字5
你输入的数字为 5!
输入1到5之间的数字6
你输入的数字不是1到5之间的,游戏结束

continue 和C语言中的类似,不会跳出所有循环,仅仅跳出当前循环
对上面的例子进行修改

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

代码运行后发现,当输入大于5的数之后,该列中的循环不会结束,语句echo "游戏结束"永远不会被执行

Shell函数

Linux的Shell可以用户定义函数,然后在Shell脚本中可以随便调用
Shell中函数的定义格式如下

[ funtion ] funname [()]

{
	action;
	[return int;]
}

说明
可以带function fun() 定义,也可以直接fun()定义,不带任何参数
参数返回,可显示加:return 返回,如果不加,将以最后一条命令运行结果,作为放回值
return后跟数值n(0-255

下面的例子定义了一个函数并进行调用

#!/bin/bash
demoFun(){
	echo "这个是我的第一个Shell函数!"
}
echo "----开始执行-----"
demoFun
echo "----函数执行完毕---"

执行结果如下

----开始执行-----
这个是我的第一个Shell函数!
----函数执行完毕---

定义一个带return语句的函数

#!/bin/bash
funWithReturn(){
	echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
	return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之后为 $?!"

执行结果如下

这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 
2
输入第二个数字: 
4
两个数字分别为 2 和 4 !
输入的两个数字之后为 6 !

注意 函数返回值在调用该函数后通过 $? 来获得。
所有的函数在使用之前都必须定义,者意味着必须将函数放在脚本开始的部分,
直至Shell解释器首次发现它的时,才可以使用。调用函数仅适用其函数名即可。

函数的参数

在Shell中函数被调用的时候可以向其传递参数的。在函数体内部,通过$n的形式来获取参数的值
例如 $1表示第一个参数, $2表示第而个参数,

带参数的函数例程

#!/bin/bash

funWithParam(){
	echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 10 34 73

执行结果如下

第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !  //不同的编译环境不一样
第十个参数为 10 !
第十一个参数为 34 !
参数总数有 12 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 10 34 73 !

注意 $10 不能获取第十个参数,获取第十个参数需要 10 n > 10 使 {10} 当n>10的时候需要使用 {n}来获取参数

此外还有几个特别的参数
$# 传递到脚步的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
$$ 脚本运行的当前进程的ID号
$! 后台运行的最后一个进程的ID号
@ @ 与 *相同,但是使用的时候添加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44880138/article/details/100992922