条件
用于判断的命令:
test 或者 [ ]
test
是shell
的内置命令
test命令可以判断的条件类型三种:
- 字符串比较
字符串比较 | 描述 |
---|---|
string1 = string2 | 字符串相同返回真 |
string1 != string2 | 字符串不同返回假 |
-n string | 字符串不NULL 空为真 |
-z string | 字符串为NULL为真 |
-
算术比较
类似C语言的关系运算符
算数比较 | 描述 |
---|---|
expression1 -eq expression2 | 两个表达式相等结果为真 |
expression1 -ne sexpression2 | 两个表达式不等结果为真 |
expression1 -gt sexpression2 | 表达式1大于表达式2则结果为真 |
expression1 -ge sexpression2 | 表达式1大于等于2则结果为真 |
expression1 -lt sexpression2 | 表达式1小于表达式2则结果为真 |
expression1 -le sexpression2 | 表达式1小于等于表达式则结果为真 |
!expression | 表达式结果取反 |
-
文件有关条件测试
file
为文件名文件测试 描述 -d file
文件类型为目录则结果为真 -f file
是普通文件则结果为真 -g file
文件set-group-id位被设置则结果为真 -r file
文件可读则为真 -s file
文件大小不为0则结果为真 -u file
文件set-user-id位被设置则结果为真 -w file
文件可写则为真 -x file
文件可执行结果为真 -e file
文件存在结果为真(不可移植,所以一般-f) #!/bin/sh if [ -f main.c ] # 判断文件main.c是否存在 then echo "main.c exists" fi
#!/bin/sh if test -f main.c # 判断文件main.c是否存在 then echo "main.c exists" fi
#!/bin/sh if [ -d main.c ] # 判断文件main.c是否是目录 then echo "file is a directory" else echo "file is not a directory" fi
控制结构
if语句
语法:
#!/bin/sh
if <condition>
then
<statements>
fi
if <condition>
then
<statements>
else
<statements>
fi
if <condition1>
then
<statements1>
elif <condition2>
<statement2>
else
<statements>
fi
#!/bin/sh
read string # 获取终端输入存放在string变量中
if [ $string = "yes" ]
then
echo "you are right"
else
echo "you are error"
fi
exit 0 # 给shell程序一个退出值
for循环语句
语法:
for <variable> in <values>
do
<statements>
done
例1:
#!/bin/sh
for var in "aa bb cc" #遍历字符串
do
echo $var
done
exit 0
输出结果:
aa bb cc
如果程序为:
#!/bin/sh
for var in "aabbcc" #遍历字符串
do
echo $var
done
exit 0
则结果为:
aabbcc
例2-利用通配符遍历:
for file in $(ls f*.sh) #遍历输出当前目录所有以f开头的脚本文件
do
echo $file
done
exit 0
while循环语句
当条件为真的时候反复执行
while <condition> #条件为真反复执行
do
<statements>
done
echo "Enter your password"
read password # 获取终端输入存放于password变量
while [ $password != "123456" ]
do
echo "try again"
read password
done
echo "pass"
exit 0
until语句
until <condition> #反复执行直到条件为真
do
<statements>
done
read string
until [ $string = "linux" ]
do
read string
done
echo $string
exit 0
case语句
语法:
case varibale in
pattern | pattern ...) statements;;
pattern | pattern ...) statements;;
esac
例1:
#!/bin/sh
read week
case $week in
"Mon") echo "Monday";;
"Tue") echo "Tuesday";;
"Wed") echo "Wednesday";;
"Thu") echo "Thursday";;
"Fri") echo "Friday";;
"Sat") echo "Saturday";;
"Sun") echo "Sunday";;
*) echo "input error";; #error to input others
esac
exit 0
例2-合并匹配模式:
#!/bin/sh
read string
case $string in
AA | BB | CC) echo "AA BB CC";; #多个条件一起匹配,其中一个成立就执行这一分支语句
L* | l*) echo "Linux";; # 只要输入的string是含有L或者l开头的字符串就会执行这一分支语句
*) echo "Hell world";;
esac
exit 0
例3-执行多条语句:
#!/bin/sh
read string
case $string in
yes | y | Yes | YES)
echo "Yes, u r right" #执行多条语句
echo "good job";; #执行多条语句
L* | l*) echo "Linux";;
*)
echo "Hell world"
exit 1;;
esac
exit 0
命令列表
AND列表
与C语言的逻辑与类似
语法:
<statement1> && <statement2> && <statement3> && ... <statementN>
#从左往右执行,前面一条语句执行返回真,下一条语句才能执行,
#直到有一条命令返回false,或者执行到最后一条语句
&&的作用:
检查前一条命令的返回值
#!/bin/sh
read string
if [ $string = "Linux" ] && echo "Hello Linux"
then
echo "success to run"
else
echo "fail to run"
fi
输入为"Linux",则输出结果为:
Hello Linux
success to run
输入不等于"linux",则输出结果为:
fail to run
OR列表
与C语言的逻辑或类似
<statement1> && <statement2> && <statement3> || ... <statementN>
#从左往右执行,前面一条语句执行返回false,下一条语句才能执行,
#直到有一条命令返回True,或者执行到最后一条语句
#!/bin/sh
touch xxx_file
rm -f xxx_file
read string
if [ -f xxx_file ] || [ $string = "Linux" ]
then
echo "Succes to Run"
else
echo "Failed to run"
fi
语句块
使用花括号{}
构造语句块:想在单条语句执行地方执行多条语句
#!/bin/sh
read string
if [ $string = "Linux" ] && { # 语句块开始
echo "Hello Linux"
echo "AA BB CC"
echo "Yes"
} #语句结束
then
echo "success to run"
else
echo "fail to run"
fi
exit 0
函数
语法
<function name>()
{
}
例1:
#!/bin/sh
PrintHello()
{
echo "hello world"
}
echo "Linux"
PrintHello #调用函数
exit 0
函数返回值
- 返回数字值
通过return命令返回
#!/bin/sh
PrintHello()
{
echo "hello world"
}
Atest()
{
echo "Test"
return 20000
}
Atest
ret=$? #通过$?得到函数返回
echo "Linux"
echo $ret
PrintHello
exit 0
-
返回字符串
让函数将需要返回的字符串保存在一个变量中,该变量然后可以在函数 结束之后被使用
#!/bin/sh string="" ReturnString() { a="hello world" string=$a } echo $string exit 0
局部变量
使用local关键字声明局部变量,局部变量和全局变量相同,全局变量覆盖局部变量(即使用全局变量)
函数传参
调用函数时可以向其传递参数。在函数内,通过 $n 的形式来获取参数的值:
$1表示第一个参数,$2表示第二个参数...$n表示第n个参数
#!/bin/bash
# author:guangjieMVP
function_param(){
echo "第1个参数为 $1 !"
echo "第2个参数为 $2 !"
echo "第3个参数为 $3 !"
echo "第10个参数为 $10 !"
echo "第10个参数为 ${10} !"
echo "第11个参数为 $11 !"
echo "参数总个数有 $# !"
echo "所有参数 $* !"
}
function_param 1 2 3 4 5 6 7 8 9 15 20
输出结果:
第1个参数为 1 !
第2个参数为 2 !
第3个参数为 3 !
第10个参数为 15 !
第10个参数为 15 !
第11个参数为 20 !
参数总个数有 11 !
所有参数 1 2 3 4 5 6 7 8 9 15 20 !
shell文件包含
语法:
. <filename>
或
source <filename>
shell_test2.sh:
#!/bin/sh
PrintString()
{
echo "I love Linux"
}
string="Hello world"
shell_test1.sh:
#!/bin/sh
. ./shell_test2.sh
PrintString
s
echo $string
exit 0