linux shell 脚本入门学习(二流程控制)

Posted 胖鹅68

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux shell 脚本入门学习(二流程控制)相关的知识,希望对你有一定的参考价值。

一、if 条件控制

语法

if … fi 语法

if condition
then
    command1 
    command2
    ...
    commandN 
fi

if和then写在同一行时,需要分号分隔。(等价于)

if condition; then
    command1 
    command2
    ...
    commandN 
fi

if else

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else

if condition1
then
    command1
elif condition2
then    
    command2
else
    commandN
fi

if 语法规则说明

  1. if结构也可以写成单行
$ if true; then echo 'hello world'; fi
  1. if关键字后面也可以是一条命令,该条命令执行成功(返回值0),就意味着判断条件成立。
$ if echo 'hi'; then echo 'hello world'; fi
hi
hello world
  1. if后面可以跟任意数量的命令。这时,所有命令都会执行,但是判断真伪只看最后一个命令,即使前面所有命令都失败,只要最后一个命令返回0,就会执行then的部分。
$ if false; true; then echo 'hello world'; fi
hello world

if结构的判断条件,一般使用test命令,有三种形式

这个表达式为真,test命令执行成功(返回值为0);表达式为伪,test命令执行失败(返回值为1)

写法一 test expression

if test -e /tmp/foo.txt ; then
  echo "Found foo.txt"
fi

写法二 [ expression ]

if [ -e /tmp/foo.txt ] ; then
  echo "Found foo.txt"
fi

[ 和 ]与内部的表达式之间必须有空格

写法三 [[ expression ]]

if [[ -e /tmp/foo.txt ]] ; then
  echo "Found foo.txt"
fi

[ 和 ]与内部的表达式之间必须有空格

test 命令用于检查某个条件是否成立

数值测试

在这里插入图片描述

#!/bin/bash

num1=100
num2=100
#if test $[num1] -eq $[num2]
# 等价于
if test $num1 -eq $num2
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

字符串测试

在这里插入图片描述

num1="W3Cschool"
num2="W3Cschool"
if test num1=num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

文件测试

语法:
	-e 文件名
		如果文件存在则为真
	-r 文件名
		如果文件存在且可读则为真
	-w 文件名
		如果文件存在且可写则为真
	-x 文件名
		如果文件存在且可执行则为真
	-s 文件名
		如果文件存在且至少有一个字符则为真
	-d 文件名
		如果文件存在且为目录则为真
	-f 文件名
		如果文件存在且为普通文件则为真
	-c 文件名
		如果文件存在且为字符型特殊文件则为真
	-b 文件名
		如果文件存在且为块特殊文件则为真
###########  文件测试
cd /bin
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

正则判断

[[ string1 =~ regex ]]
regex是一个正则表示式,=~是正则比较运算符

#!/bin/bash
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
  echo "INT is an integer."
  exit 0
else
  echo "INT is not an integer." >&2
  exit 1
fi

test 判断的逻辑运算

  • AND运算:符号&&,也可使用参数-a。
if [ condition ] && [ condition ]; then
  command
fi
  • OR运算:符号||,也可使用参数-o。
  • NOT运算:符号!。
#!/bin/bash
MIN_VAL=1
MAX_VAL=100
INT=50
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
  if [[ $INT -ge $MIN_VAL && $INT -le $MAX_VAL ]]; then
    echo "$INT is within $MIN_VAL to $MAX_VAL."
  else
    echo "$INT is out of range."
  fi
else
  echo "INT is not an integer." >&2
  exit 1
fi

算术判断

((…)) 作为算术条件,进行算术运算的判断

if ((3 > 2)); then
  echo "true"
fi

注意

  1. 算术判断不需要使用test命令,而是直接使用((…))结构
  2. 如果算术计算的结果是非零值,则表示判断成立。这一点跟命令的返回值正好相反
$ if ((1)); then echo "It is true."; fi
It is true.
$ if ((0)); then echo "It is true."; else echo "it is false."; fi
It is false.

普通命令的逻辑运算

  • $ command1 && command2
    先执行command1,只有command1执行成功后, 才会执行command2。

  • $ command1 || command2
    先执行command1,只有command1执行失败后, 才会执行command2

二、循环

for循环

语法

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

in列表可以包含替换 数字、字符串和文件名。

案例说明

  1. in 是字符串
for str in 'This is a string'
do
    echo $str
done
  1. in 是数字
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

while 循环

while condition
do
    command
done

无线循环

while :
do
    command
done
while true
do
    command
done
for (( ; ; ))

until 循环

循环至少执行一次

until condition
do
    command
done

跳出循环

break

break命令允许跳出所有循环(终止执行后面的所有循环)。

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done

continue

它不会跳出所有循环,仅仅跳出当前循环

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done

三、case

语法

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

esac(就是case反过来)作为结束标记

注意事项:

  • 取值后面必须为单词in
  • 每一模式必须以右括号结束
  • 取值可以为变量或常数
  • 匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;

匹配规则

  • a):匹配a。
#!/bin/bash
echo -n "输入一个1到3之间的数字(包含两端)> "
read character
case $character in
  1 ) echo 1
    ;;
  2 ) echo 2
    ;;
  3 ) echo 3
    ;;
  * ) echo 输入不符合要求
esac
  • a|b):匹配a或b。
  • [[:alpha:]]):匹配单个字母。
  • ???):匹配3个字符的单词。
  • *.txt):匹配.txt结尾。
  • *):匹配任意输入,通过作为case结构的最后一个模式。

四、思维导图下载

以上是关于linux shell 脚本入门学习(二流程控制)的主要内容,如果未能解决你的问题,请参考以下文章

python-入门

python入门,数据类型,字符编码,文件处理

linux学习shell:人工解析lnmp脚本

Python入门

Python 自动化指南(繁琐工作自动化)第二版:二流程控制

shell脚本学习