本文是整理老师ppt中有关shell编程的部分内容。
需要下载ppt查看的请移步:
https://download.csdn.net/download/ayangann915/11114322
本地变量,也称为⽤户⾃定义变量,是在当前shell环境,当前进程内有效的变量。
当⽤户注销,或者启⽤⼦shell、⼦进程时该变量不起作⽤。
**定义本地变量:**变量名=变量值
注意:
变量与变量值以等号“=”来连接。
等号两边不能直接接空格。
变量名称只能是英⽂字⺟、下划线与数字, 但数字不能是开头字符。
若有空格,可以使⽤双引号或单引号将变量内容结合起来。
⽤户也可以在命令⾏上同时对多个变 量赋值,赋值语句之间⽤空格分开
注意:变量赋值是从左到右进⾏的。
x=10 y=$x. 执⾏命令后,y的值也是10。
appledeMacBook-Pro:~ apple$ s1=hello
appledeMacBook-Pro:~ apple$ s2="hello word"
appledeMacBook-Pro:~ apple$ echo $s1
hello
appledeMacBook-Pro:~ apple$ echo $s2
hello word
appledeMacBook-Pro:~ apple$ x=4 y=5
appledeMacBook-Pro:~ apple$ echo $x $y
4 5
appledeMacBook-Pro:~ apple$ x=10 y=$x
appledeMacBook-Pro:~ apple$ echo $x $y
10 10
有时需要在说明⼀个变量并对它设置为⼀个特定 值后就不再改变它的值时,可以⽤下⾯的命令来保 证⼀个变量的只读性。
appledeMacBook-Pro:~ apple$ readonly x=10
appledeMacBook-Pro:~ apple$ y=20 x=$y
-bash: x: readonly variable #显示其只读性
appledeMacBook-Pro:~ apple$ echo $y $x
20 10
语法:read [-pt] 变量名
功能:读取来⾃键盘输⼊的变量。 可选项:
-p:后⾯可以接提示信息
-t:后⾯可以接等待的秒数。为了防⽌⼀直 等待⽤户。
例1:让⽤户通过键盘输⼊内容,将该内容变成atest变量
appledeMacBook-Pro:~ apple$ read atest
this is a test
appledeMacBook-Pro:~ apple$ echo $atest
this is a test
例2:提示⽤户30秒内输⼊⾃⼰的名字,将该输⼊字符串 做成named变量。
appledeMacBook-Pro:~ apple$ read -p"enter your name:" -t 30 name
enter your name:ann
appledeMacBook-Pro:~ apple$ echo $name
ann
变量的显示使⽤echo命令,格式如下: echo $变量名
echo ${变量名}
例1:
appledeMacBook-Pro:~ apple$ num=2
#这并不会打印出“this is the 2nd”,⽽仅仅打印“this is the ”, 因为shell会去搜索变量numnd的值,但是这个变量是没有值的。
appledeMacBook-Pro:~ apple$ echo "this is the $numnd"
this is the
#可以使⽤花括号来告诉shell我们要打印的是num变量
appledeMacBook-Pro:~ apple$ echo "this is ths ${num}nd"
this is ths 2nd
例2:要将name的内容多出“yes”
#方法一
appledeMacBook-Pro:~ apple$ name=${name}yes
appledeMacBook-Pro:~ apple$ echo $name
annyes
#方法二
appledeMacBook-Pro:~ apple$ name="$name"yes
appledeMacBook-Pro:~ apple$ echo $name
annyesyes
例3:在⼦Shell下变量的作⽤范围
appledeMacBook-Pro:~ apple$ a=11
appledeMacBook-Pro:~ apple$ bash
bash-3.2$ echo $a
bash-3.2$ a=22
bash-3.2$ echo $a
22
bash-3.2$ exit
exit
appledeMacBook-Pro:~ apple$ echo $a
11
释放本地变量时使⽤unset 命令
appledeMacBook-Pro:~ apple$ name="ann"
appledeMacBook-Pro:~ apple$ echo $name
ann
appledeMacBook-Pro:~ apple$ unset name
appledeMacBook-Pro:~ apple$ echo $name
appledeMacBook-Pro:~ apple$
环境变量,也称为系统变量。它与本地变量的差 别在于,可以⽤于所有⽤户进程。也就是可以将其 值传送给Shell运⾏的其他命令或脚本使⽤。
这些环境变量在shell开始执⾏的时候就已经定义 了,⽤户还可以重新定义这些变量。
使⽤env命令查看当前系统中定义的环境变量。
PS1=‘[\u@\h \W]$ ’
\u:当前⽤户的账号名称
\h:仅取主机名的第⼀个名字
\W:⼯作⽬录名称,仅列出最后⼀个⽬录名
$: 提示符,如果是root时,提示符为#,否则就是$
$PATH:决定了shell将到哪些⽬录中寻找命令或程序,PATH的值是⼀系列⽬录,当您运⾏⼀个 程序时,Linux在这些⽬录下进⾏搜寻所执⾏的 程序。 可以通过修改PATH的值来改变命令的搜寻⽬ 录。
⽤export命令,可以把本地变量设置为环境变量,
格式为: export 变量名
也可以在给变量赋值的同时使⽤export 命令,
格式为: export 变量名=变量值(若等号两边有空 格,则必须使⽤引号括起来)
例:将n1设为环境变量
appledeMacBook-Pro:~ apple$ n1=11 n2=22
appledeMacBook-Pro:~ apple$ echo $n1 $n2
11 22
appledeMacBook-Pro:~ apple$ export n1
appledeMacBook-Pro:~ apple$ bash
bash-3.2$ echo $n1
11
bash-3.2$ echo $n2
bash-3.2$ exit
exit
查询环境变量:
appledeMacBook-Pro:~ apple$ env
TERM_PROGRAM=Apple_Terminal
SHELL=/bin/bash
TERM=xterm-256color
TMPDIR=/var/folders/pn/j3zy5vyd20v6mkl0xlhjqqz00000gn/T/
Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.MuDxxgeqwl/Render
TERM_PROGRAM_VERSION=404
TERM_SESSION_ID=E0D77A81-B3EE-4C36-A232-8CE611F99FAF
USER=apple
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.dbe8JLEFWS/Listeners
n1=11
PATH=/anaconda3/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin
PWD=/Users/apple
LANG=zh_CN.UTF-8
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0
SHLVL=1
HOME=/Users/apple
LOGNAME=apple
_=/usr/bin/env
appledeMacBook-Pro:~ apple$
可以看到,环境变量多了一个n1=11
某些变量在⼀开始执⾏脚本时就被设定且不再改变,它们被称为特殊变量。
⽤户只能根据shell的定义来使⽤这些变 量,⽽不能重新定义它们。
所有的特殊变量都是由$和另⼀个符号组成的。
例1:
例2:设计脚本abc如下:
#!/bin/bash
cal 1 $1
cal 2 $1
cal 3 $1
运行:显示2020年的前三个月份
appledeMacBook-Pro:~ apple$ bash abc.sh 2020
一月 2020
日 一 二 三 四 五 六
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
二月 2020
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
三月 2020
日 一 二 三 四 五 六
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
命令shift可以移动命令⾏参数。运⾏shift后,把每个 命令⾏参数向左移动⼀个位置,即$2、$3…依次变 为$1、$2…,原先的$1将被丢掉。
例:shell脚本shf内容如下:
#!/bin/bash
echo $1 $2
shift
echo $1 $2
运行:
appledeMacBook-Pro:~ apple$ bash shf.sh hi hello bye
hi hello
hello bye
在bash中,许多字符有特殊的含义。如果希 望bash忽略某些字符的特殊含义,可以使⽤⼀ 种称为“引⽤”的技术,通知Shell暂时忽略被引 ⽤字符的特殊含义,将其作为普通字符处理。
引用时有三种符号:
将转义符“\”放在Shell特殊字符之前, 则Shell忽略该字符原有的特殊含义。
⽤这种⽅式时,必须在每⼀个欲忽略其 特殊含义的特殊字符之前添加⼀个“\”字符。
将字符串放在⼀对单引号之间,则单引号内的所有字符的特殊含义都被忽略,⽽只作为普通字符解释。
例:下⾯两条命令是等效的
appledeMacBook-Pro:~ apple$ echo 'f*?'
f*?
appledeMacBook-Pro:~ apple$ echo f\*\?
f*?
例:
appledeMacBook-Pro:~ apple$ string='$PASH'
appledeMacBook-Pro:~ apple$ echo $string
$PASH
使⽤双引号的引⽤与单引号的类似,括在双引号内的⼤部分特殊字符将被看作普通 字符,但也有⼀些特殊字符即便⽤双引号括 起来之后仍然保留着其特殊的意义,⽐如 $、\、”和`。
appledeMacBook-Pro:~ apple$ pwd
/Users/apple
appledeMacBook-Pro:~ apple$ string="$HOME \$HOME"
appledeMacBook-Pro:~ apple$ echo $string
/Users/apple $HOME
命令替换符“ ` ”(反引号)的作⽤跟引⽤字符的作⽤相反。
反引号括起来的字符串被Shell解释为命令⾏,在执⾏时,Shell⾸先执⾏该命令⾏,并以 它的标准输出结果取代整个反引号(包括两个 反引号)部分。
这个字符所对应的键⼀般位于键盘的左上角。
appledeMacBook-Pro:~ apple$ pwd
/Users/apple
appledeMacBook-Pro:~ apple$ string="current directory is `pwd`"
appledeMacBook-Pro:~ apple$ echo $string
current directory is /Users/apple
appledeMacBook-Pro:~ apple$
appledeMacBook-Pro:~ apple$ today=`date`
appledeMacBook-Pro:~ apple$ echo today is $today
today is 2019年 4月 9日 星期二 19时11分44秒 CST
在shell脚本中, 任何加在“#”号后⾯的数据将全 部被视为注释⽂字⽽被忽略(注意:后⾯紧接着 是“!”号的除外)。
shell脚本必须以类似于下⾯的⾏开始(必须放在 脚本的第⼀⾏):
!/bin/bash
意指使⽤/bin/bash作为shell解释执⾏此shell脚 本中的命令。
test是Shell程序中的⼀个表达式,通常⽤在 流程控制for、while、until、if等结构中,⽤test 命令去判断⽂件的存在与性质,变量的相互关系。
语法:test <表达式>
如果<表达式>成⽴,test返回0,反之,test 返回⼀个⾮0值
作⽤:测试字符串是否相等,⻓长度是否为零,字符串是否 为NULL。
常⽤字符串测试的<表达式>有:
-z <“字符串”>:⽐较字符串的⻓长度是否等于0,如果等于0则 为“是”,返回“0”,下同。
-n <”字符串”>:⽐较字符串的⻓长度是否⼤于0,如果⼤于0则 为“是”。
<字符串1> = <字符串2>:⽐较两个字符串是否相同,相同则 为“是”。等号两边要有空格。判断相等时也可⽤==。 <字符串1> != <字符串2>:⽐较两个字符串是否相同,不同则 为“是”。 !=两边要有空格。
例:
appledeMacBook-Pro:~ apple$ str1=hello
appledeMacBook-Pro:~ apple$ test -z $str1 #判断长度是否为0
appledeMacBook-Pro:~ apple$ echo $? #显示结果
1 #1表示结果不为0,即长度不等于0
appledeMacBook-Pro:~ apple$ test -n $str1 #测试长度是否大于0
appledeMacBook-Pro:~ apple$ echo $?
0
appledeMacBook-Pro:~ apple$ str2=abcd #测试字符串是否等于abcd
appledeMacBook-Pro:~ apple$ test $str2 = abcd
appledeMacBook-Pro:~ apple$ echo $?
0
appledeMacBook-Pro:~ apple$ test $str1 == $str2 #测试两个字符串是否相等
appledeMacBook-Pro:~ apple$ echo $?
1
appledeMacBook-Pro:~ apple$ test $str1 != $str2 #测试两个字符串是否不等
appledeMacBook-Pro:~ apple$ echo $?
0
常⽤于数值⽐较的<表达式>有: <数值表达式1> <算符> <数值表达式2>(算符两边要有空格),此处,<算符>可以是:
-eq: 两者相等。
-ne: 两者不等。
-lt: 前者⼩于后者。
-le: 前者⼩于或等于后者。
-gt: 前者⼤于后者。
-ge: 前者⼤于或等于后者。
appledeMacBook-Pro:~ apple$ int1=4
appledeMacBook-Pro:~ apple$ test $int1 -gt 2
appledeMacBook-Pro:~ apple$ echo $?
0 #4>2
appledeMacBook-Pro:~ apple$ int1=1234
appledeMacBook-Pro:~ apple$ int2=01234
appledeMacBook-Pro:~ apple$ test $int1 -eq $int2
appledeMacBook-Pro:~ apple$ echo $?
0 #相等
⽂件测试表达式通常是为了测试⽂件的⽂件操作逻辑,测试 符号如下。
-e:对象是否存在,存在则返回值为0。
-d:对象存在且为⽬录,则返回值为0。
-f:对象存在且为⽂件,则返回值为0。
-L:对象存在且为符号连接,则返回值为0。
-r:对象存在且可读,则返回值为0。
-s:对象存在且⻓长度⾮0,则返回值为0。
-w:对象存在且可写,则返回值为0。
-x:对象存在且可执⾏,则返回值为0。 !:测试条件的否定。与上述的符号⽤空格分隔开。
例:
(待完成,还有文件的基础知识未看)
常⽤于逻辑测试的<表达式>有:
! <表达式>: <表达式>不成⽴。
<表达式1> -a <表达式2>:<表达式1>与<表达式2>同时成⽴。
<表达式1> -o <表达式2>:<表达式1>或<表达式2>成⽴。
appledeMacBook-Pro:~ apple$ test 1 == 1 -a 2 == 2
appledeMacBook-Pro:~ apple$ echo $?
0 #true
appledeMacBook-Pro:~ apple$ test 1 == 1 -a 2 == 3
appledeMacBook-Pro:~ apple$ echo $?
1 #false
appledeMacBook-Pro:~ apple$ test 1 == 1 -o 2 == 3
appledeMacBook-Pro:~ apple$ echo $?
0 #true
appledeMacBook-Pro:~ apple$ test ! 0
appledeMacBook-Pro:~ apple$ echo $?
1
和其他⾼级程序设计语⾔⼀样,Shell提供了⽤来 控制程序和执⾏流程的命令,包括条件分⽀和循环结构,⽤户可以⽤这些命令创建⾮常复杂的程序。
(1)条件控制:有if 、 case等结构。
(2)循环控制:有for、while、until等结构。
在Shell程序中,条件判断语句可以使⽤if条件语句 和case条件语句,两者的区别在于使⽤case语句 的选项⽐较多⽽已。
控制流if的⽤法如下:
if <判别命令>;
then {命令清单1}
else {命令清单2} //else语句可省略
fi
此处,<判别命令>通常是上述的“test <表达式>” 。如果只写 <表达式>,则⽤中括号括起来,(中括号两边要有空格)。 如果<判别命令>返回0(对于test命令来说,就是其后的<表 达式>成⽴),则将执⾏then后的命令清单;反之,则执⾏else 后的命令清单。
shell语句中的分号
分号是多个语句之间的分隔符 ,当只有⼀个 语句的时候,末尾⽆需分号,最后⼀个语句后 ⾯也⽆需分号。
例如:
if [ XXXXXXXXXXXXX]; then
它完全等效于下⾯的两句:
if [ XXXXXXXXXXXXX]
then
例:使用if-else语句创建shell程序,内容如下,文件名为bbbb.sh
echo -n "do you want to continue:Y or N:"
read ANSWER
if [ $ANSWER = N -o $ANSWER = n ];
then echo i will exit
else echo i will continue
fi
运行:
appledeMacBook-Pro:~ apple$ bash bbbb.sh
do you want to continue:Y or N:n
i will exit
appledeMacBook-Pro:~ apple$ bash bbbb.sh
do you want to continue:Y or N:y
i will continue
注意:
1.创建简单的Shell程序。 [、]、=、-o两边要有空格,=也可以 使⽤vi编辑器创建Shell程序, ⽤==(=作为赋值符号时不能写成==) ⽂件名为bbbb,⽂件内容如 下所示。
$ANSWER,N两边写不写引号⽆所 谓
第五⾏也可以写成
if test $ANSWER = N –o $ANSWER = n
【例】 使⽤if-then-else语句创建⼀个根据 输⼊的分数判断分数是否及格的Shell程序。
使⽤vi编辑器创建Shell程序,⽂件名为ak, ⽂件内容如下所示。
echo -n "please input your score:"
read score
echo "your score is $score"
if [ $score -ge 90 ];
then echo -n "优秀"
else if [ $score -ge 80 -a $score -lt 90 ];
then echo -n "良好"
else if [ $score -ge 70 -a $score -lt 80 ];
then echo -n "中等"
else if [ $score -ge 60 -a $score -lt 70 ];
then echo -n "及格"
else echo -n "不及格"
fi
fi
fi
fi
运行:
cBook-Pro:~ apple$ bash ak.sh
please input your score:88
your score is 88
良好appledeMacBook-Pro:~ apple$ bash ak.sh
please input your score:77
your score is 77
中等appledeMacBook-Pro:~ apple$ bash ak.sh
please input your score:66
your score is 66
及格appledeMacBook-Pro:~ apple$ bash ak.sh
please input your score:44
your score is 44
不及格appledeMacBook-Pro:~ apple$
if条件语句⽤于在两个选项中选定⼀项,⽽case条件选择为⽤ 户提供了根据字符串或变量的值从多个选项中选择⼀项的⽅ 法,其语法格式如下所示:
case <变量> in
<字符串1> ) {<命令清单1>};; )后⾯可以没有空格
…
<字符串n> ) {<命令清单n>};;
*) {其他命令};;
esac
执⾏时,将判别**<变量>的值与所列出的n个字符串中的哪⼀个 匹配**,然后就执⾏其后的命令清单,直到遇到⼀对分号(;;)为 ⽌。字符串中可含通配符,如果能同时匹配多个字符串,则只执⾏第⼀个匹配字符串后的命令。
在case运算式中也可以使⽤Shell的通配符 (“*”,“?”,“[ ]”)。
通常⽤“*”作为case命令的最后运算式以便在前⾯找不到任何相应的匹配项时执⾏“其他命令”的命令。
例:capital.sh
# $1意思是输入的第一个内容
case $1 in
china) echo beijing;;
usa) echo washington;;
uk) echo london;;
russia) echo moskow;;
*) echo out of my knowledge;;
esac
运行:
appledeMacBook-Pro:~ apple$ bash capital.sh china
beijing
appledeMacBook-Pro:~ apple$ bash capital.sh uk
london
appledeMacBook-Pro:~ apple$ bash capital.sh usa
washington
appledeMacBook-Pro:~ apple$ bash capital.sh russia
moskow
appledeMacBook-Pro:~ apple$ bash capital.sh japan
out of my knowledge
例:使⽤case语句 创建⼀个菜单选择的 Shell脚本。 使⽤vi编辑器创建 Shell程序,⽂件名 为za,
echo "1 restore"
echo "2 backup"
echo "3 unload"
echo -n "enter choice"
read choice
case $choice in
1) echo "retore";;
2) echo "backup";;
3) echo "unload";;
*) echo "sorry,wrong!"
exit 11
esac
运行:
appledeMacBook-Pro:~ apple$ bash za.sh
1 restore
2 backup
3 unload
enter choice1
retore
appledeMacBook-Pro:~ apple$ bash za.sh
1 restore
2 backup
3 unload
enter choice2
backup
appledeMacBook-Pro:~ apple$ bash za.sh
1 restore
2 backup
3 unload
enter choice3
unload
appledeMacBook-Pro:~ apple$ bash za.sh
1 restore
2 backup
3 unload
enter choice4
sorry,wrong!
【例】假如给出⽉份数 字作为参数,你就能编写 ⼀个回送⽉份名的脚 本month。当所给出的数 字不在1和12之间时,将 得到出错消息。
echo "enter month:"
read month
case $month in
1|01) echo "一月";;
2|02) echo "二月";;
3|03) echo "三月";;
4|04) echo "四月";;
5|05) echo "五月";;
6|06) echo "六月";;
7|07) echo “七月”;;
8|08) echo "八月";;
9|09) echo "九月";;
10) echo “十月”;;
11) echo "十一月";;
12) echo “十二月”;;
*) echo "wrong!"
esac
运行:
appledeMacBook-Pro:~ apple$ bash month.sh
enter month:
2
二月
appledeMacBook-Pro:~ apple$ bash month.sh
enter month:
09
九月
appledeMacBook-Pro:~ apple$ bash month.sh
enter month:
12
“十二月”
appledeMacBook-Pro:~ apple$ bash month.sh
enter month:
15
wrong!
|两边不加空格也可以,注意是|,而不是||
在Shell程序中使⽤循环控制语句可以使⽤for语 句、while语句以及until语句。
for循环的语法结构如下:
for <循环变量> [in <循环变量取值集>]
do <命令清单>
done
如果for语句的后半部分被省略,则默认的<循环变量 取值集>就是命令⾏参数集。
如果命令清单中有多条命令,系统会依次执⾏。
例:显示2012年头3个⽉⽉历的shell脚本
for i in 1 2 3 4
do cal $i 2019
done
运行:
appledeMacBook-Pro:~ apple$ bash show.sh
一月 2019
日 一 二 三 四 五 六
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
二月 2019
日 一 二 三 四 五 六
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28
三月 2019
日 一 二 三 四 五 六
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
四月 2019
日 一 二 三 四 五 六
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
或者:
for i
do cal $i 2019
done
#运行:
bash show.sh 1 2 3 4
expr 命令
expr命令是⼀个⼿⼯命令⾏计数器,⽤于在UNIX/LINUX下 求表达式变量的值,⼀般⽤于整数值,也可⽤于字符串。
格式为:
expr Expression
(命令读⼊Expression 参数,计算它的值,然后将结果写⼊到标准输出)
参数应⽤规则:
expr用法实例
appledeMacBook-Pro:~ apple$ expr 15%3
15%3
appledeMacBook-Pro:~ apple$ expr 15 % 3
0
appledeMacBook-Pro:~ apple$ expr 100 + 20
120
appledeMacBook-Pro:~ apple$ expr 30 / 3 * 2
expr: syntax error
appledeMacBook-Pro:~ apple$ expr 30 / 3 \* 2
20
#注意乘法中符号的使用,* 前面要加反斜杠屏蔽其特殊含义
说明:expr在循环中⽤于增量计算。先将变量初始 化为0,然后循环值加1,反引号的⽤法为命令替代。
#loop=0
#loop=`expr $loop + 1`
例:使⽤for语句创建求命令⾏上所有整数之和的Shell 程序,文件名:sum
sum=0
for i in $*
do sum=`expr $sum + $i`
done
echo $sum
运行:
appledeMacBook-Pro:~ apple$ bash sum.sh 1 2 3 4 5
15
appledeMacBook-Pro:~ apple$ bash sum.sh 1 2
3
控制流while也是⼀种循环控制结构,⽤法是:
while <判别命令>
do <命令清单>
done
当<判别命令>返 回0时(对于test命令,就是其后的 表达式成⽴),则执⾏do后的命令清单,然后再重作 循环;否则,退出循环。
while控制经常与前述的shift命令结合使⽤。
例:编写⼀个shell脚本exist,⽤于判别其后⽤参数⽅式指 定的⼀系列⽂件是否存在。
while test -n "$1"
do
if test -e $1
then echo "$1 exist"
else echo "$1 not exist"
fi
shift
done
运行:
appledeMacBook-Pro:~ apple$ bash exist.sh abs
abs not exist
appledeMacBook-Pro:~ apple$ bash exist.sh show
show not exist
appledeMacBook-Pro:~ apple$ bash exist.sh show.sh
show.sh exist
appledeMacBook-Pro:~ apple$ bash exist.sh sum.sh
sum.sh exist
例:使⽤while语句创建⼀个计算1到5的平⽅的Shell程序。
loop=0
sum=0
while test $loop -lt 5 #loop<5时
do
d=`expr $loop \* 2`
sum=`expr $sum + $d`
loop=`expr $loop + 1`
done
echo "$sum"
运行:
appledeMacBook-Pro:~ apple$ bash qiuhe.sh
20
例:使⽤while 语句创建⼀个输 ⼊exit退出的Shell 程序。
echo -n "enter :"
read exit
while [ $exit = "exit" ]
do
echo " shutdown!"
shutdown -h now
done
until 控制流与while 控制流⽤法类似,但作 ⽤相反。⽤法为:
until <判别命令>
do <命令清单>
done
当<判别命令>返回⾮0值时,执⾏do后的< 命令清单>,然后循环检查条件;
当<判别命令 >返回0值时,退出循环。
例:加从0开始的五个偶数(使⽤until语句)
loop=0
sum=0
until test $loop -ge 5
do
d=`expr $loop \* 2`
sum=`expr $sum + $d`
loop=`expr $loop + 1`
done
echo $sum
例:使⽤until语句创建⼀个计算1~5的平⽅的Shell程序。
int=1
until test $int -gt 5
do
result=`expr $int \* $int`
echo $result
int=`expr $int + 1`
done
运行:
appledeMacBook-Pro:~ apple$ bash pingfang2.sh
1
4
9
16
25
有时需要基于某些准则退出循环或跳过循环步。shell提供两个命令实现此功能。 (
1)break
(2)continue
break和continue的最⼤区别在于,break跳出整个循 环,⽽c**ontiune则跳过当次循环的剩余部分并直接进⼊ 下⼀次循环。**这两个的⽤法和C语⾔相同。
在shell脚本中,还可以利⽤所谓的“here⽂ 本”功能,即可在脚本⽂件中嵌⼊⼀段⽂档,作 为脚本中所使⽤的命令的标准输⼊。具体⽤法 为:
<命令> <
<作为输⼊的⽂本内容>
!
其中“!”符号也可⽤“EOF”、“END”等替代。
使⽤here⽂本,可以⽅便地将⼀些需要进 ⾏⽤户交互的命令放⼊到shell脚本中。
所有函数在使⽤前必须定义。
这意味着必须将函数 放在脚本开始部分,直⾄shell解释器⾸次发现它时, 才可以使⽤。
下⾯将⾃定义⼀个函数,⽤于显示当前系统的时 间。
Time()
{
echo "The system time now is `date `"
}
函数的调⽤,只需要使⽤函数名就可以调⽤已经定义好的函 数。