代码中的[]执行基本的算数运算,如
#!/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 le
t 命令,它用于执行一个或多个表达式,变量计算中不需要加上$表示变量
和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的时候需要使用
10当n>10的时候需要使用{n}来获取参数
此外还有几个特别的参数
$#
传递到脚步的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
$$ 脚本运行的当前进程的ID号
$! 后台运行的最后一个进程的ID号
@
与
@ 与
@与*相同,但是使用的时候添加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。