Linux Bash基础(二)
【摘要】 Linux Bash基础知识(二)
-
逻辑判断:test关键字
-
选择结构:if-else, case
-
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)