用于判断的命令:
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
语法:
#!/bin/sh
if
then
fi
if
then
else
fi
if
then
elif
else
fi
#!/bin/sh
read string # 获取终端输入存放在string变量中
if [ $string = "yes" ]
then
echo "you are right"
else
echo "you are error"
fi
exit 0 # 给shell程序一个退出值
语法:
for in
do
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 #条件为真反复执行
do
done
echo "Enter your password"
read password # 获取终端输入存放于password变量
while [ $password != "123456" ]
do
echo "try again"
read password
done
echo "pass"
exit 0
until #反复执行直到条件为真
do
done
read string
until [ $string = "linux" ]
do
read string
done
echo $string
exit 0
语法:
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
与C语言的逻辑与类似
语法:
&& && && ...
#从左往右执行,前面一条语句执行返回真,下一条语句才能执行,
#直到有一条命令返回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
与C语言的逻辑或类似
&& && || ...
#从左往右执行,前面一条语句执行返回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
语法
()
{
}
例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 !
语法:
.
或
source
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