blog-web/source/_posts/linux/2.2、shell编程(3)-流程控制与函数.md
结发受长生 10e4564c71 时间调整
2018-05-20 19:39:08 +08:00

2.7 KiB

title date tags categories
2.2、shell编程(3)-流程控制与函数 2018-3-6 00:52:22
linux
shell
linux

判断

if condition1
then
  command1
elif condition2
then 
  command2
else
  command3
fi

如果else没有语句执行 则不能留空 , 最好直接不写这个else

举例

if [ `ps ax | grep -c "ssh"` -ge 1 ]
then
  echo "RUNNING"
fi
# grep的-c参数代表对过滤后的行进行计数

# 也可以使用test命令做判断
if test `ps ax | grep -c "ssh"` -ge 1
then
  echo "RUNNING"
fi

循环

for循环

for ((i=1 ; i<=10 ; i++))
do
  echo $i
done
# 注意使用(()), 里面的变量并不需要加$

for (( ; ; )) - 死循环

foreach

bash支持对集合进行迭代的foreach类型语法 使用for ... in ...

# seq命令可以生成一个序列
for i in `seq 1 10`
do
  echo $i
done

# 这样也是一个序列
for i in {1..10}
do
  echo $i
done

# 迭代遍历一个数组
arr=("ab" "cd" "ef")
for item in ${arr[@]}
do
  echo $item
done

如果一个命令返回的是一个集合 , 也可以执行循环迭代

for item in `ls /usr/local`
do
  echo $item
done

当然如果是找一个目录下的文件 , 也可以不用ls命令 for循环自带路径查找功能

for item in /usr/local/*
do
  echo $item
done
# 注意路径不要加引号

while循环

while循环是在判断条件为false的时候结束循环

cnt=1
while (( $cnt<=5 ))
do
  echo $cnt
  let "cnt++"
done

while :或者while true表示死循环

until循环

格式与while循环基本一致 , 只不过是当判断条件为true的时候结束循环

cnt=1
until (( $cnt>=5 ))
do
  echo $cnt
  let "cnt++"
done

break与continue

表示跳出循环以及继续下一次循环 , 与其他语言当中类似

多选择语句

类似其他语言当中的switch , bash当中使用case关键字

echo "input a number:"
# read表示从终端读取用户输入内容
read num
case $num in
    1) echo "数字1"
    ;;
    2) echo "数字2"
    ;;
    3|4) echo "3或者4"
    ;;
    ok) echo "字符串ok"
    ;;
    *) echo "其他内容"
    ;;
esac

函数

shell当中可以自定义函数

function myFunc() {
  echo "参数 $1,$2,$3"
  echo "所有参数:"
  for arg in $@
  do
    echo $arg
  done
}
myFunc "aa" "bb"

说明 :

  1. 与获取脚本的参数类似 , 使用$序号或者${序号}来获取 但是如果到了10 , 就必须写作${10} , 否则会与$1产生歧义
  2. function 关键字也可以省略

文件包含

一个shell脚本当中可以引入另一个shell脚本

. /home/sookie/test2.sh
# 或者
source /home/sookie/test2.sh

被引入的文件并不需要可执行权限