条件循环语句、函数
一、条件语句
1). 基本的条件语句
- 常用方式
if [ boolean ] # 注意中括号与变量之间有一个空格,必须写
then
do something # 条件成立执行逻辑
fi # if 语句块结束标志
- 其他方式
if [ boolean ]; then
do something
fi
- 判断字符串是否相等可以使用“=”或者“==”;这点和其他语言有点差异,建议使用“==”;统一容易记忆
name=$1
if [ $name == "xiaoyu" ] # 注意==左右有空格
then
echo "hello $1"
fi
- else 分支
name1=$1 # 这里的赋值等号左右没有空格
name2=$2
if [ $name1 == $name2 ] # 注意==左右有空格
then
echo "you input the same names: $name1"
else
echo "you input different names: $name1 $name2"
fi
- elif 分支
name=$1
if [ $name == "a" ]
then
echo "you input a"
elif [ $name == "b" ]
then
echo "you input b"
else
echo "you input neither a or b; it's $name"
fi
2). 条件语句
- 测试字符串
条件 | 意义 |
---|---|
[ |
两个字符串是否相等,大小写敏感 |
[ |
两个字符串是否b不相等,大小写敏感 |
[ -z $str ] | 字符串是否为空 |
[ -n $str ] | 字符串是否为不为空 |
#!/bin/bash
if [ -z $1 ]
then
echo "No parameter"
else
echo "There is at least one parameter"
fi
- 测试数字
条件 | 意义 |
---|---|
[ |
两个数字是否相等。和判断字符串所用的符号( = )不一样。eq 是 equal 的缩写,是英语“等于”的意思。 |
[ |
两个数字是否不同。ne 是 not equal 的缩写,是英语“不等于”的意思。 |
[ |
数字 num1 是否小于 num2。lt 是 lower than 的缩写,是英语“小于”的意思。 |
[ |
数字 num1 是否小于或等于 num2。le 是 lower or equal 的缩写,是英语“小于或等于”的意思。 |
[ |
数字 num1 是否大于 num2。gt 是 greater than 的缩写,是英语“大于”的意思。 |
[ |
数字 num1 是否大于或等于 num2。ge 是 greater or equal 的缩写,是英语“大于或等于”的意思。 |
#!/bin/bash
if [ $1 -ge 10 ]
then
echo "You have entered a number greater than 10 or equal to 10"
else
echo "You have entered a number lower than 10"
fi
- 测试文件
条件 | 意义 |
---|---|
[ -e $file ] | 文件是否存在。e 是 exist 的首字母,表示“存在”。 |
[ -d $file ] | 文件是否是一个目录。因为 Linux 中一切都是文件,目录也是文件的一种。d 是 directory 的首字母,表示“目录”。 |
[ -f $file ] | 文件是否是一个文件。f 是 file 的首字母,表示“文件”。 |
[ -L $file ] | 文件是否是一个符号链接文件。L 是 link 的首字母,表示“链接”。 |
[ -r $file ] | 文件是否可读。r 是 readable 的首字母,表示“可读的”。 |
[ -w $file ] | 文件是否可写。w 是 writable 的首字母,表示“可写的”。 |
[ -x $file ] | 文件是否可执行。x 是 executable 的首字母,表示“可执行的”。 |
[ |
文件 file1 是否比 file2 更新。nt 是 newer than 的缩写,表示“更新的”。 |
[ |
文件 file1 是否比 file2 更旧。ot 是 older than 的缩写,表示“更旧的”。 |
#!/bin/bash
read -p 'Enter a directory : ' file
if [ -d $file ]
then
echo "$file is a directory"
else
echo "$file is not a directory"
fi
3). 逻辑运算
符号 | 意义 |
---|---|
[ a && b ] | 两个&。表示“逻辑与”。此符号两端的条件必须全为真,整个条件测试才为真;只要有一个不为真,整个条件测试为假。 |
[ a || b ] | 两个竖线。表示“逻辑或”。此符号两端的条件只要有一个为真,整个条件测试就为真;只有两个都为假,整个条件测试才为假。 |
[ ! boolean | 非运算 |
#!/bin/bash
if [ $# -ge 1 ] && [ $1 == 'love' ] # 注意写法,每一个判断需要用中括号括起来
then
echo "Great !"
echo "You know the password"
else
echo "You do not know the password"
fi
#!/bin/bash
read -p 'Enter a file : ' file
if [ ! -e $file ]
then
echo "$file does not exist"
else
echo "$file exists"
fi
4). case 多个条件
#!/bin/bash
case $1 in
"Matthew")
echo "Hello Matthew !"
;;
"Mark")
echo "Hello Mark !"
;;
"Luke")
echo "Hello Luke !"
;;
"John")
echo "Hello John !"
;;
*)
echo "Sorry, I do not know you."
;;
esac
-
case $1 in
:$1
表示我们要测试的变量是输入的第一个参数。in 是英语“在…之中”的意思。 -
"Matthew")
:测试其中一个 case,也就是$1
是否等于"Matthew"
。当然,我们也可以用星号来做通配符来匹配多个字符,例如"M*")
可以匹配所有以 M 开头的字符串。 -
;;
:类似于主流编程语言中的break;
,表示结束 case 的读取,程序跳转到 esac 后面执行。 -
*)
:相当于 if 条件语句的 else,表示“否则”,就是“假如不等于上面任何一种情况”。 -
esac
:是 case 的反写,表示 case 语句的结束。 -
|
: case中的多个条件
#!/bin/bash
case $1 in
"dog" | "cat" | "pig")
echo "It is a mammal"
;;
"pigeon" | "swallow")
echo "It is a bird"
;;
*)
echo "I do not know what it is"
;;
esac
二、循环语句
1). while循环
- 语法
while [ 条件 ]
do
do something
done
while [ 条件 ]; do
do something
done
- 案例
#!/bin/bash
let "sum = 0"
while [ $1 != "END" ]
do
let "sum += $1"
shift
done
echo "sum: $sum"
2). until循环
while循环相关的条件判断【鸡肋】
#!/bin/bash
let "sum = 0"
until [ $1 == "END" ]
do
let "sum += $1"
shift
done
echo "sum: $sum"
3). for循环
类似于Python中的for语法
- 案例
#!/bin/bash
for animal in 'dog' 'cat' 'pig'
do
echo "$animal "
done
- 案例
#!/bin/bash
listfile=`ls`
for file in $listfile
do
echo -e "file \n"
done
- 案例
#!/bin/bash
for file in `ls`
do
echo -e "$file \n"
done
- 复制文件案例
#!/bin/bash
for file in `ls *.sh`
do
cp $file $file-copy
done
- sql 序列命令
#!/bin/bash
for i in `seq 1 2 3 4 5 6 7 8 9`
do
echo $i
done
三、函数
函数必须定义在使用之前!【解释性语言的特性】
1. 函数定义
函数名 () {
函数体
}
function 函数名 {
函数体
}
- 函数没有签名
- 函数的返回值只能为整型,表示执行结果,默认为0,正常
- 函数执行直接写函数名即可
#!/bin/bash
printSomething () {
echo "xing zhe sun"
}
printSomething # 调用函数
2. 为函数传递参数
与
./x.sh var1 var2
这种方式类似; 同样适用$#
$0
$1
$2
获取参数
#!/bin/bash
printVar () {
echo "$# $0 $1 $2"
}
printVar 1 2
3. 函数返回的状态
如果返回值为整型,也可以直接返回当做函数的返回值
#!/bin/bash
printVar () {
echo "$# $0 $1 $2"
return 1
}
printVar 1 2
echo $? # $? 为上一次函数运行的命令或者返回的状态,一般0代表正常
4. 变量的作用范围
- 默认一个变量是全局的
- 函数中创建的变量为局部变量
网友评论