Linux Bash基础(二)

举报
码农爱学习 发表于 2021/10/07 23:01:17 2021/10/07
【摘要】 Linux Bash基础知识(二)

主要内容:

  • 逻辑判断:test关键字

  • 选择结构:if-else, case

  • 循环结构:while-do, for

1 逻辑判断

bash不仅可以进行数值运算,通过test关键字还可以进行逻辑判断。

1.1 数值大小的判断

例如判断3是否大于2的大小:

test 3 -gt 2; echo $?
0

注意判断成立,返回0,不成立返回1。

参数 含义 助记
-gt 大于 greater than
-lt 小于 less than
-eq 等于 equal
-ne 不等于 not equal
-ge 大于等于 greater equal
-le 小于等于 less equal

1.2 文本字符串的判断

例如判断两文本是否相等:

test abc = abx; echo $?
1

因为判断不成立,所以返回1。

另外注意:等号的两侧要有空格,否则就变成变量赋值了!

参数 含义
= 相等
!= 不相等
> 字典顺序大于
< 字典顺序小于

1.3 文件的判断

例如判断文件是否存在:

test -e a.out; echo $?
参数 含义 助记
-e 文件存在 exist
-r 文件存在&可读 readable
-w 文件存在&可写 writable
-x 文件存在&可执行 executable
-f 文件存在&普通文件 file
-c 文件存在&字符型特殊文件 char
-b 文件存在&块型特殊文件 block
-d 文件存在&为目录 directory

2 选择结构

2.1 if-else

类比C语言中的if else-if else结构,注意结尾是fi,即if反过来写。

if condition1
then
    command1
elif condition2
then 
    command2
else
    commandN
fi

例如,demo_if.sh内容如下:

#!/bin/bash
​
var=`whoami`
if test $var = "root"
then 
    echo "You are root"
else
    echo "$var, You are not root"
fi

2.2 case

类比C语言中的switch-case结构,注意,break;;取代,结尾是esac,即case反过来写。

case 值 in
模式1)
    command1
    command2
    ;;
模式2)
    command1
    command2
    ;;  
esac

例如,demo_case.sh代码如下:

#!/bin/bash
​
var=`whoami`
echo "You are $var"
​
case $var in
root)
    echo "You are God."
    ;;
deeplearning)
    echo "You are a happy user."
    ;;
*)
    echo "You are the others."
    ;;
esac

注意:文本标签除了是一串具体的文本,还可以包含通配符,如;

通配符 含义 文本标签的例子 通过的条件文本
* 任意文本 *) Xyz, 123, ...
任意一个字符 a?c) abc, axc, ...
[] 范围内一个字符 [1-5] [b-d]) 2b, 3d, ...

3 循环结构

3.1 while

类比C语言中的while-do结构,注意以done结尾。

例如demo_while.sh代码如下(注意符号+之前有一个空格!):

#!/bin/bash
​
now=`date +'%Y%m%d%H%M'`
deadline=`date --date='30 second' +'%Y%m%d%H%M'`
​
while test $now -lt $deadline
do
    date
    echo "not yet"
    sleep 10
    now=`date +'%Y%m%d%H%M'`
done
​
echo "now, deadline reached"
2019年 11月 11日 星期一 15:07:31 CST
not yet
2019年 11月 11日 星期一 15:07:41 CST
not yet
2019年 11月 11日 星期一 15:07:51 CST
not yet
now, deadline reached

3.2 for

类比C语言中的for结构,注意也是以done结尾。

例如demo_for.sh代码如下:

#!/bin/bash
​
for var in `ls log*`
do
    rm $var
done

该脚本的功能是查找本目录中以“log”开头的文件,并将其依次删除。

另外,结合seq关键字,可以控制循环次数,比如:

seq 1 2 10
1
3
5
7
9

4 应用举例

高斯求和,计算1到100所有整数的加和:

#!/bin/bash
​
total=0
for number in `seq 1 1 100`
do
    total=$(($total+$number))
done
​
echo $total
5050

也可以用while-do结构:

#!/bin/bash

total=0
num=1
while :
do
    if test $num -gt 100
    then
        break
    fi
    total=$(($total+$num))
    num=$(($num+1))
done

echo $total

计算1到100所有不被3整除的数的和,使用continue语句

#!/bin/bash

total=0
for num in `seq 1 1 100`
do
    if test $((${num}%3)) -eq 0
    then
        continue
    fi
    total=$(($total+$num))
done

echo $total
3367
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。