shell脚本进阶

shell脚本进阶

文章目录

  • shell脚本进阶
    • bash条件判断
      • 条件测试类型
      • 条件测试的表达式
      • 整数测试(双目)
      • 字符测试
      • 文件测试
      • 组合测试条件
      • 条件判断,控制结构
        • 单分支if语句
        • 双分支if语句
          • if语句小游戏
        • 多分支if语句
    • 分支选择
    • 循环语句
      • for循环
        • for循环取出/etc/passwd用户
      • while循环
        • while循环正常用法
        • while循环特殊用法
      • until循环
      • 循环语句特殊情况
    • 定义脚本退出状态码

bash条件判断

条件测试类型

条件测试分为整数测试字符测试文件测试

条件测试的表达式

[ echoes ]
[[ echoes ]]
test echoes

整数测试(双目)

-eq 测试两个整数是否相等

-ne 测试两个整数是否不等

-gt 测试一个数是否大于另一个数

-lt 测试一个数是否小于另一个数

-ge 大于或小于

-le 小于或等于

字符测试

== 等值比较,检查两边的内容是否一致,切记 == 两边要有空格

!= 检查两边内容是否不一致,不一致为真,一致为假

=~ 左侧字符穿能否被右侧的所匹配到,此表达式应用于双中括号[[]]中

-z “string” 测试指定字符串是否为空,空则为真,不空则为假
-n “string” 测试指定字符串是否不空,不空则为真,空则为假

文件测试

# 存在性测试
-e	测试文件是否存在
# 存在性及类别测试
-b	测试文件是否为块设备文件
-c	测试文件是否为字符设备文件
-f	测试文件是否为普通文件
-d	测试指定路径是否为目录
-h	测试文件是否为目录
-l	测试文件是否为符号链接文件
-p	测试文件是否为命名管道文件
-s	测试文件是否为套接字文件
# 文件权限测试
-r	测试当前用户对指定文件是否有读权限
-w	测试当前用户对指定文件是否有写入权限
-x	测试当前用户对指定文件是否有执行权限
# 文件特殊权限测试
-g	测试文件是否有sgid权限
-u	测试文件是否有suid权限
-k	测试文件是否有sticky权限
# 文件大小测试
-s	测试文件是否非空
# 文件是否打开测试
-t fd	fd表示的文件描述是否已经打开并且与某终端相关
# 双目测试
file1 -ef file2	测试文件1与文件2是否为同一文件
file1 -ef file2	测试文件1是否比文件2新
file1 -ef file2	测试文件1是否比文件2旧
# 无分类
-N	测试文件自从上一次被录取之后是否被修改过
-O	测试文件是否存在并且被当前用户拥有
-G	测试文件是否存在并且默认组是否为当前用户组

组合测试条件

-a	与关系
-o	或关系
!	非关系

例如

# 总计个数 大于 1 与 总计个数 小于 3
[ $# -gt 1 -a $# -le 3 ]

# 总计个数 大于 1 后再次统计 总计个数 小于 3
[$# -gt 1 ] && [$# -le 3]

条件判断,控制结构

单分支if语句

if 判断条件;then
	陈述1
	陈述2
	........
fi

双分支if语句

if 判断条件;then
	陈述1
	陈述2
	.........
else
	陈述1
	陈述2
	.........
fi
if语句小游戏
# ----------------猜数字-----------------
#!/bin/bash
num=50

read -p "请输入你所猜到的数字:" user_num
if [ $num -eq $user_num ];then
    echo "哇瑟!好厉害!"
else
    echo "你猜错了,哈哈哈"
fi

多分支if语句

if 判断条件1;then
	陈述1
	陈述2
	.........
elif 判断条件2;then
	陈述3
	陈述4
	.........
else
	陈述5
	陈述6
	.........
fi

分支选择

case $变量名 in            
value1)                
    陈述               
    ...                
    ;;            
value2)                
    陈述                
    ...                
    ;;            
*)                
    陈述                
    ...                
    ;;        
esac
另:case支持glob风格的通配符:
    *       任意长度任意字符
    ?       任意单个字符
    []      指字范围内的任意单个字符
    abc|bcd abc或bcd

循环语句

循环语句通常需要有一个进入条件和一个退出条件

  • for循环
  • while循环
  • until循环

for循环

for循环当列表不为空时进入循环,否则退出循环

for 变量 in 列表; do
    循环体
done

for ((expr1;expr2;expr3))
{
    循环体
}

for (( expr1 ; expr2 ; expr3 ));do
    循环体
done

expr1   //用于指定初始条件,给控制变量一个初始值
expr2   //判定什么时候退出循环
expr3   //修正expr1指定的变量的值

//如何生成列表:
    {1..100}
    seq [起始数] [步进长度] 结束数

for循环取出/etc/passwd用户

#------取出/etc/passwd的用户以及UID---------
#!/bin/bash
Fa=/etc/passwd
for (( i=1;i<=$(cat $Fa | wc -l);i++ ));do
    user_name=$(awk -F ':' "NR==$i {print $ 1}" $Fa)
    user_UID=$(awk -F ':' "NR==$i {print $ 3}" $Fa)

    echo "hello!$user_name,you UID is $user_UID."
done
    echo "一共有$(cat $Fa | wc -l)个用户."

while循环

while循环适用于循环次数未知的场景,注意要有退出条件。
条件满足时进入循环,条件不满足了退出循环。

while循环正常用法

while 条件; do
    陈述
    ...
done

while循环特殊用法

//while循环特殊用法一:死循环
while :;do
    陈述
    ...
done

//这里的冒号可以改成任何非空值

while循环特殊用法二:逐行读取某文件,将值存入line变量中
while read line;do
    陈述
    ...
done < /etc/passwd

#####while循环脚本

#-----while特殊用法二取用户-------
#! /bin/bash
Fa=/etc/passwd

while read line;do
    user_name=$(echo $line | awk -F ':' 'NR==1 { print $1 }')
    user_UID=$(echo $line | awk -F ':' 'NR==1 { print $3 }')
    echo “hello! $user_name 您的UID是 $user_UIDecho -------------------------
done < $Fa
#-------用while循环猜数字-------
#!/bin/bash

i=0
num=$[$RANDOM %100]

while :;do
    ((i++))
    read -p "请输入一个数字" user_num
    echo $user_num | egrep '^[0-9]+$' &> /dev/null
    if [ $? -ne 0 ];then
        echo "您输入的不是数字!请重试!"
        exit
    fi
    if [ $user_num -gt $num ];then
        echo "您输入的数字大了!"
    elif [ $user_num -lt $num ];then
        echo "您输入的数字小了!"
    else
        ehco "您输入正确!"
        echo "您一共回答了$i次."
        exit
    fi
done

until循环

条件不满足时进入循环,条件满足了退出循环。

until 条件; do
    陈述
    ...
done

循环语句特殊情况

break [num]:提前退出循环。当循环语句中出现break时,将提前退出循环,不再执行循环后面的语句

continue [num]:提前结束本轮循环而进入下一轮循环。当循环语句执行到continue时,continue后面的语句将不再执行,提前进入下一轮循环

定义脚本退出状态码

//exit命令用于定义执行状态结果

exit #      //此处的#号是一个数字,其范围可以是0-255

如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码

注意:脚本中一旦遇到exit命令,脚本会立即终止

你可能感兴趣的:(Linux)