【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
posted @ 2022-05-31 22:32  .Neterr  阅读(29)  评论(0)    收藏  举报