shell编程-分支语句
结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。
主要包括:条件测试语句(两路分支)、多路分支语句、循环语句、循环控制语句和后台执行语句等。
条件语句
if 表达式 then 命令表 fi
如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。
if和fi是条件语句的语句括号, 必须成对使用;
命令表中的命令可以是一条, 也可以是若干条。
可以使用test命令test命令测试的条件成立时, 命令返回值为真(0),否则返回值为假(非0).if test -f $filename也可以使用[]方括号来代替if [ -f $filename ]方括号
举个例子:
if [ -f $1 ] (测试参数是否为文件) then echo "File $1 exists" (引用变量值) fi if [ -d $HOME/$1 ] (测试参数是否为目录) then echo "File $1 is a directory" (引用变量值) fi
if 表达式 then 命令表 elif 表达式 then 命令表1 else 命令表2 fi
如果表达式为真, 则执行命令表1中的命令, 再退出if语句; 否则执行命令表2中的语句, 再退出if语句.
多路分支语句
case…esac case 字符串变量 in 模式1) 命令表1 ;; 模式2 | 模式3) 命令表2 ;; …… 模式n) 命令表n ;; esac
可以使用如下的例子作为练习:
# The statement of case…esac if [ $# -eq 0 ] then echo "No argument is declared" exit fi case $1 in file1) echo "User selects file1" ;; file2) echo "User selects file2" ;; *) echo "You must select either file1 or file2!" ;; esac
shell编程-循环语句
循环语句for的用法
for 变量名 in 单词表 do 命令表 done
科普一个seq命令,用于列出一系列数字类似于python的range。
for I in `seq 1 100` do SUM=`expr $SUM + $I` done echo $SUM
程序就用于生成0-100的求和值。
也可以使用类似于C语言的写法。
for ((I = 1; I <= 10 ; I++)) #注意是两个括号 do SUM=`expr $SUM + $I` done echo $SUM
循环语句while的用法
while 命令或表达式 do 命令表 done
while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
#!/bin/bash I=0 while [ $I -lt 5 ] do I=`expr $I + 1` echo -n "input score:" read $S case 'expr $S/10' in 10 |9) echo "A" ;; 6|7|8) echo "B" ;; *) echo "C" ;; esac echo "$I" done
上面的脚本用来输入信息输出对应的字母,一共五次。
循环控制语句
break 和 continue
break n则跳出n层;
continue语句则马上转到最近一层循环语句的下一轮循环上,
continue n则转到最近n层循环语句的下一轮循环上.
shell编程-函数
shell函数调用
#方式1拿到传参 value_name=`function_name [arg1 arg2 … ]` #方式2拿到传参 function_name [arg1 arg2 … ] echo $?
举个例子:
grep_user() { R=`grep "^$1:" /etc/passwd | wc -l` #以l开头 以:结尾 echo $R return $R } echo -n "input sername:" read USER grep_user $USER RET=$? if [ $RET -eq 1 ] then echo "$USER exist" else echo "$USER not exist" fi echo "-$?-"
函数变量作用域
全局作用域:在脚本的其他任何地方都能够访问该变量。
局部作用域:只能在声明变量的作用域内访问。
声明局部变量的格式:Local variable_name =value
Scope() { Local lclvariable =1 Gblvariable = 2 echo “lclavariable in function = $ lclvariable ” echo “Gblvariable in function = $ Gblvariable ” } Scope echo “lclavariable in function = $ lclvariable ” echo “Gblvariable in function = $ Gblvariable ”