【shell命令】流程控制、函数
test命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符串和文件三个方面的测试,并根据测试结果返回退出状态码(0表示真,非0表示假)。
test命令有三种基本语法形式:
test expression[ expression ](注意方括号内侧必须有空格)[[ expression ]](Bash扩展版本,支持更多功能如正则匹配)
这三种形式功能相同,只是写法不同。其中方括号形式最为常用,因为它更直观且易于阅读。
数值测试
在test、[]中用下列写法,在(())和[[]]中用==、!=、>、>=、<、<=
-eq --等于则为真 案例:[$n -eq 1 ] && echo 1 || echo 0
-ne --不等于则为真
-gt --大于则为真
-ge --大于等于则为真
-lt --小于则为真
-le 小于等于则为真
案例:
# 写法1
num1=100
num2=100
if test $num1 -eq $num2; then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
# 写法2
a=3
if [ $a -eq 3 ]
then
echo "相等"
else
echo "不等"
fi
# 写法3
if [[ $a == 3 ]]
then
echo "相等"
else
echo "不等"
fi
字符串测试
= --等于则为真 说明:=两端必须有空格
!= --不等于则为真
-z --长度为0则为真 案例:[ -z "" ] && echo 1||echo 0
-n --长度不为0则为真 案例:[ -n "" ] && echo 0||echo 1 [ ! -z "" ]&& echo 0||echo 1 --两个案例结果相同
$ --检测字符串长度是否不为空,不为空返回true 案例:[ $a ] 返回true
案例:
str1="hello"
str2="world"
if test "$str1" = "$str2"; then
echo "字符串相等"
else
echo "字符串不相等"
fi
文件测试
-e --如果文件存在则为真 案例: [ -e 1.txt ] && echo 1 || echo 0 --如果文件存在输出1,否则输出0
-r --如果文件存在且可读则为真
-w --如果文件存在且可写则为真
-x --如果文件存在且可执行则为真
-s --如果文件存在且至少有一个字符则为真
-d --如果文件存在且为目录则为真
-f --如果文件存在且为普通文件则为真
-c --如果文件存在且为字符型特殊文件则为真
-b --如果文件存在且为块特殊文件则为真
-nt --文件1 -nt 文件2 判断文件1修改时间是否比文件2新
-ef --文件1 -ef 文件2 判断文件1与文件2是否为同一文件
案例:
#写法1、
if test -e /bin/bash; then
echo '文件已存在!'
else
echo '文件不存在!'
fi
#写法2、
test -f /bin/bash && echo '文件已存在!' || echo '文件不存在!'
#如果目录不存在就创建目录
if [ ! -d "$LOCAL_DIR" ]; then
mkdir -p "$LOCAL_DIR" # -p 自动创建父目录
fi
逻辑运算符
-a:逻辑与,在[[]]中用&& 案例:[ $n -eq 1 -a -f 3.txt ] && echo 1 || echo 0
-o:逻辑或,在[[]]中用|| 案例:判断1 -o 判断2
!:逻辑非 案例:!判断
案例:
案例1、
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
案例2、
if test -e ./notFile -o -e ./bash; then
echo '至少有一个文件存在!'
else
echo '两个文件都不存在'
fi
if..else
if [ condition ]
then
command1
fi
if [ condition ]
then
command1
elif [ condition2 ]
then
command2
else
command3
fi
案例1:
# 接收键盘输入参数
read -p "input param1:" param1
if [ $param1 -eq '1' ]
then
echo 1
else
echo 'other'
fi
案例2:在(())和[[]]中用==、!=、>、>=、<、<=
read -p "input param1:" param1
if (( $param1 == '1' ))
then
echo 1
else
echo 'other'
fi
案例3
read -p "input param1:" param1
[ $param1 -eq 1 ] && {
echo 1
} || {
echo 'other'
}
可以使用
[ condition ] && command1 || command2语句代替if..else..
for循环
#案例1
for n in 1 2 3 4 5
do
echo $n
done
#案例2、遍历数组
arr1=(1 2 3 4)
for item in ${arr1[*]}
do
echo $item
done
#案例3
for n in {1..10}
do
echo $n
done
#案例4:遍历参数
for v in $@;do
echo $v
done
案例5:遍历文件
for file in `ls /etc`;do
echo "${file}.txt"
done
案例6:遍历带空格的字符串
TARGET_NAMES="target1 target2 target3"
for item in $TARGET_NAMES;do
echo $item
done
输出:
target1
target2
target3
while循环
案例1:
n=1
while test $n -lt 5
do
echo $n
n=$((n+1))
done
案例2:(逐行读取文件)
while read line
do
echo $line
done < 1.txt
案例3:(逐行读取文件,与上个案例相同)
exec < 1.txt
while read line
do
echo $line
done
until
与while相反,当条件为true时停止
case
case “字符串变量” in
值1) 指令1
;;
值2) 指令2
;;
*) 指令3
esac
case案例
read -p "input:" value
case $value in
1)
echo "1"
;;
2)
echo "2"
;;
*)
echo "*"
esac
函数
函数语法
1、function_name(){echo 'i'm function';}
2、function function_name(){echo 'i'm function';}
函数参数:$1、$2、$3、$4...
$0:表示父脚本名称
$#:参数个数
$?:返回参数
$*:全部参数
$@:全部参数
案例
#! /bin/bash
function sum(){
result=0;
for i in $*
do
result=$(($result+$i))
done
return $result
}
sum 1 2 3
echo $?
shift命令
功能:将所有的位置参数向左移动一位,丢弃原来的 $1,并重新编号剩余参数。
执行后,原来的 $2 变为 $1,$3 变为 $2,依此类推,而 $0(脚本名)不变。
例如,原始参数为 a b c d,执行 shift 后变为 b c d。
若需一次性移动多位,可指定数字(如 shift 2)。
echo "$@"
shift
echo '--------'
echo "$@"
执行脚本./1.sh 1 2 3
输出:
1 2 3
------
2 3

浙公网安备 33010602011771号