目录
shell条件判断语句
if分支结构
case语句
echo语句
日期
date命令
日历cal
循环语句
循环含义
for循环
for循环从1加到100
while和until
while从1加到100的和
until
总结
单分支语法结构
单分支:
if 判断条件;
then 条件为真的分支代码
fi
判断主机的的连通性,$?=0,则网络通顺,否则不通
#!/bin/bash
ping -c 3 192.168.37.1 &>/dev/null
if
[ $? = 0 ]
then
echo "And the real network smooth"
return 1
fi
echo "The network is not smooth with the real machine"
运行结果,网络不通顺
[root@xiaobin /data]# bash test2.sh
The network is not smooth with the real machine
双分支语法结构
双分支
if 判断条件; then
条件为真的分支代码
else条件为假的分支代码
fi
比如测试当前系统是否为管理身份
#!/bin/bash
if [ "$USER" = "root" ]
then
echo "This is the admin user"
else
echo "This is not an administrator user"
fi
~
运行结果,这是管理员用户
[root@xiaobin /data]# bash test1.sh
This is the admin user
多分支结构
if 判断条件1; then
条件1为真的分支代码
elif 判断条件2; then
条件2为真的分支代码
elif 判断条件3; then
条件3为真的分支代码...
else
以上条件都为假的分支代码
fi
例如,学生成绩高于90且小于等于100为优秀,70-89为良好,60-69为及格,其余不及格
#!/bin/bash
read -p "Please enter your score:" cj
if [ $cj -ge 90 ] && [ $cj -le 100 ]
then
echo "Your grades are:$cj"
echo "You are very good"
elif [ $cj -ge 70 ] && [ $cj -le 89 ]
then
echo "Your grades are:$cj"
echo "Result Fine"
elif [ $cj -ge 60 ] && [ $cj -le 69 ]
then
echo "Your grades are:$cj"
echo "You passed the exam"
else
echo "Your grades are:$cj"
echo "You failed your grade"
fi
运行结果
[root@xiaobin /data]# bash test3.sh
Please enter your score:80
Your grades are:80
Result Fine
格式
case 变量引用 in
PAT1)
分支1
;;PAT2)
分支2
;;
...*)
默认分支
;;esac
case支持glob风格的通配符:
* 任意长度任意字符
? 任意单个字符
[] 指定范围内的任意单个字符
| 或者,如: a|b
想一个例子,比如输入任何yes/y/Y/ye...或者no/No/n..输出的都是yes/no
#!/bin/bash
read -p "input 'yes' or no:" i
case $i in
[Yy]|[Yy][Ee][Ss])
echo "yes"
;;
[Nn]|[Nn][Oo])
echo "no"
;;
*)
echo "What the hell is that"
esac
运行结果,不管输入什么,输出的都是yes或者no
[root@xiaobin /data]# bash yes.sh
input 'yes' or no:Yes
yes
[root@xiaobin /data]# bash yes.sh
input 'yes' or no:N
no
[root@xiaobin /data]# bash yes.sh
input 'yes' or no:NO
no
[root@xiaobin /data]# bash yes.sh
input 'yes' or no:yES
yes
再比如,用case实现成绩的排序
满分为优秀,80-99良好;60-79及格;其余不及格,输入别的报警
#!/bin/bash
read -p "Please enter your score:" score
case $score in
[100])
echo "Your grades are:$score You are very good"
;;
[89][0-9])
echo "Your grades are:$score Result FineYou"
;;
[67][0-9])
echo "Your grades are:$score You passed the exam"
;;
[0-9]|[1-5][0-9])
echo "Your grades are:$score You failed your grade"
;;
*)
echo "input error"
esac
运行结果
[root@xiaobin /data]# bash test4.sh
Please enter your score:87
Your grades are:87 Result FineYou
常用选项
echo -n | 表示不换行输出 |
echo -e | 表示输出转义符 |
-e "\n" | 输出换行 |
-e "\r" | 光标移至行首,并且不换行 |
-e "\t" | 插入Tab键 |
-e "\f" | 换行,但光标仍停留在原处 |
\ \ | 表示插入"\"本身 |
-e "\b" | 表示退格 不显示钱一个字符 |
-e "\c" | 抑制更多的输出或不换行 |
\a | 发出警告音 |
选项的一些实例
"\t"
[root@xiaobin /data]# echo -e adc'\t'123
adc 123
”\b“后面多加一个\b就是再多退一格
[root@xiaobin /data]# echo -e '456789\b123'
45678123
[root@xiaobin /data]# echo -e '456789\b\b123'
4567123
”\c’使用在数字中间会把后面内容删除
[root@xiaobin /data]# echo -e '456789\c123'
456789[root@xiaobin /data]# echo -e '456789\c'
456789[root@xiaobin /data]#
“\f‘,光标不动
[root@xiaobin /data]# echo -e '456\f789'
456
789
显示当前时间
[root@xiaobin /data]# date
2021年 10月 26日 星期二 17:57:15 CST
-d | 你描述的日期,显示指定字符串所描述的时间,而非当前时间 |
%F | 完整日期格式,等价于 %Y-%m-%d |
%T | 时间(24小时制)(hh:mm:ss) |
显示前三天的时间
[root@xiaobin /data]# date -d '-3 day'
2021年 10月 23日 星期六 18:04:39 CST
完整格式
[root@xiaobin /data]# date -d '-3 day' +%F
2021-10-23
前三天的时间(24小时制)
[root@xiaobin /data]# date -d '-3 day' +%F-%T
2021-10-23-18:04:27
直接输入cal,输出当前月份
[root@xiaobin /data]# cal
十月 2021
日 一 二 三 四 五 六
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
后面跟年份,输出当年的日历
[root@xiaobin /data]# cal 2018
查看1752年9月份的日历
将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件
重复运行次数
循环次数事先已知
循环次数事先未知
常见的循环的命令:for, while, until
执行机制:
依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环
结束
如果省略 [in WORDS ... ] ,此时使用位置参数变量 in "$@"
语法
for 名称 [in 词语 ... ]
do 命令
done
为列表中的每个成员执行命令。
或者
for (( 表达式1; 表达式2; 表达式3 ))
do 命令
done
算术 for 循环。
例如显示1到10
[root@xiaobin /data]# for i in {1..10}
> do
> echo $i
> done
1
2
3
4
5
6
7
8
9
10
[root@xiaobin /data]# for ((i=1; i<=10;i++))
> do
> echo $i
> done
1
2
3
4
5
6
7
8
9
10
运行结果
[root@xiaobin /data]# bash xiangjia.sh
1到100的和为5050
打印99乘法表
#!/bin/bash
for i in {1..9}
do
for j in $(seq $i)
do
echo -e "$j*$i=$[j*i] \t\c"
done
echo
done
#!/bin/bash
for ((i=1; i<=9; i++))
do
for ((j=1; j<=$i; j++))
do
echo -e "$i*$j=$[$j*$i] \t\c"
done
echo
done
显示结果
打印倒叙99乘法表
#!/bin/bash
for i in {9..1..-1}
do
for j in $(seq $i)
do
echo -e "$j*$i=$[j*i] \t\c"
done
echo
显示结果
相对于for,需要知道循环次数,我们只知道停止条件,不知道次数,就需要使用while,直到达到条件
while
当命令判断为假时停止until
当命令判断为真时停止
while 命令
do 命令
done
只要测试成功即执行命令。
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
sum=$[i+sum]
let i++
done
echo "1到100的和为:$sum"
运行结果
[root@localhost data]#bash which.sh
1到100的和为:5050
用法: 重复测试某个条件,只要条件不成立则反复执行
格式:
until 条件测试操作
d
o
命令序列
done
例如
#!/bin/bash
sum=0
i=0
until [ $i -gt 100 ]
do
sum=$[sum+i]
let i++
done
echo "1加到100的和:$sum"
运行结果
[root@localhost data]#bash a.sh
1加到100的和:5050
break跳出单个循环后面加数字2则代表跳出两层循环
continue终止某次循环中的命令,但是不会完全终止命令
本次主要学习了条件和循环语句,shell其实和C的逻辑大差不差,只是语法略有不同,只要了解他们的原理其实都一个道理,关键是能混合在一起使用。