元字符
1. & 符号,命令在后台运行
ping www.baidu.com & 在后台也运行ping www.baidu.com
2. &&符号,前面一个命令执行成功,才会继续执行下一条命令
pwd && haha && ls
# /root
# -bash: haha: command not found
3. ;符号,前面一个命令不管执行是否成功,都会运行下一条命令
pwd ; haha ; ls
# /root
# -bash: haha: command not found
# anaconda-ks.cfg a.txt
4. *符号,匹配所有
touch {1..9}.txt 创建1-9.txt文件
ls *.txt 查看当前目录下的所有.txt结尾的文件
# 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt a.txt
5. ()符号,命令都在子shell中执行,在括号里面的命令后面加上&符号等同于开启一个孤儿进程
(ping www.baidu.com &) 在当前窗口执行后,关闭当前窗口
ps -ef | grep ping 重新打开一个新的窗口
# root 1799 1 0 15:13 ? 00:00:00 ping www.baidu.com
6. _符号,取变量名时使用
A_aaa=1
7. = 符号,判断是否相等
name="egon" 定义一个变量
[ $name = "egon" ]
echo $? 判断上一条命令执行结果是否为真
# 0
[ $name = "nana" ]
echo $? 判断上一条命令执行结果是否为真
# 1
8. | 符号,将一个进程的处理结果传递给另外一个进程
ps aux | grep ssh 过滤出所有ssh产生的进程,包含ps aux | grep ssh这条命令本身
ps aux | grep [s]sh []符号,过滤出ps aux | grep [s]sh这条命令本身所产生的进程
9. &? 符号, 判断上一条命令的执行结果(0为真,1为假)
ps -ef | grep xxx
# root 1884 1837 0 15:33 pts/0 00:00:00 grep --color=auto xxx
echo $? 上一条命令有执行结果,判定为真
# 0
ps -ef | grep [x]xx
echo $? 上一条命令没有执行结果,判定为假
# 1
10. \ 符号,转义特殊字符
expr 2 \* 2 * 是包含所有的意思, \把*进行了转义,*在命令中表示乘
# 4
11. 脚本文件运行控制
- 我们在写脚本文件时,可以对脚本文件的内容通过一些选项来进行控制
1. set -o errexit 执行文件中运行的命令出现报错,停止运行并退出脚本
2. set -o nounset 执行文件中的变量名没有被定义,停止运行并退出脚本
# 当变量值不存在时,变量名取不到值默认为空
3. set -o pipefail 执行文件中的管道失败,停止运行并退出脚本
管道失败,指的是管道前一个命令的运行结果是失败的,无法将命令执行的结果丢入管道中,这个时候的管道里面的内容为空。
echo 命令默认是不支持管道的,但是我们可以通过echo命令来做一个演示。
例如: aaa | echo 123
# 123
# -bash: aaa: command not found
echo $? 上一条命令的有执行结果,系统默认上一条命令的运行结果为真
# 0
12. {} 符号,指定范围
touch /test/{1..5}{a..c}.txt 在test目录下指定范围,创建文件
ls /test
# 1a.txt 1c.txt 2b.txt 3a.txt 3c.txt 4b.txt 5a.txt 5c.txt
# 1b.txt 2a.txt 2c.txt 3b.txt 4a.txt 4c.txt 5b.txt
x=111
echo ${x}222 指定变量值的范围
# 111222
13. [] 符号,等同于test命令
man test
-eq 两个值相等
-ne 两个值不相等
-ge 大于等于
-gt 大于
-le 整数1小于等于整数2
-lt 整数1小于整数2
x=111
test $x -eq 111 判断变量x是否等于111
echo $? 判断上一条命令的结果是否为真
# 0
14 . && 符号(同时成立即为真),|| 符号(成立任意一个即为真)
- 我们判断两个字符串是否相等用 = 符号
name="nana"
passwd="123"
[ $name = "nana" ] && [ $passwd = "123" ] &&(并且) 条件同时成立 , [ = ]取反[ != ]
echo $?
# 0
[ $name = "nana" ] || [ $passwd = "123***" ] ||(或者) 条件成立任意一个 , 即判定为真
echo $?
# 0
偷懒原则 : && , 命令执行到任意一个一个为假,即为假
|| , 命令执行到任意一个为真,即为真
案例(利用元字符做判断)
案例1
m=111
n=222
[ $m -gt $n ] && echo $m || echo $n 判断条件m是大于n是否成立 , 条件为真打印m的值,条件为假打印n的值
# 222
&& 的优先级 大于 ||
案例2
ping -c1 www.baidu.com &>/dev/null && echo "ok" || echo "no" 判断能不能ping通百度,ping通打印ok,否则打印no
# ok
&>/dev/null,将输出结果丢入黑洞(/dev/null黑洞设备)
15. ?符号,匹配任意一个字符
touch /a/{1..5}.txt
touch /a/123.txt
ls /a/?.txt
# /a/1.txt /a/2.txt /a/3.txt /a/4.txt /a/5.txt
ls /a/???.txt
# /a/123.txt
16. 范围内的任意一个字符[a-Z],(aAbB..xXz)
touch {a..z}.txt
touch {A..Z}.txt
ls /opt/[a-z].txt a.txt,A.txt..z.txt(不包含Z.txt)
ls /opt/[a-Z].txt 匹配所有,包含Z.txt
if判断
-
什么是if判断
依据条件的真假来决定是否做某事 -
为何要有if判断
为了让计算机啊能够像人意义去做判断 -
如何用if判断
if 条件1 ;then
代码1
代码2
代码3
elif 条件2 ;then
代码1
代码2
代码3
elif 条件3 ;then
代码1
代码2
代码3
......
else
代码1
代码2
代码3
fi
- if 双分支案例
vim ./a.txt
# !/bin/bash
set -o errexit 报错则停止脚本运行
echo "start..."
read -p "请输入你的年龄" age 将输入的值赋值给变量名age
if [ $age -eq 18 ];then -eq 判断输入的值是否相等
echo "too young"
else
echo "too old"
fi
echo "end..."
- if多分支案例
vim b.txt
#!/bin/bash
read -p "请输入你的分数" score
if [ $score -ge 90 ];then
echo "优秀"
elif [ $score -ge 80 ];then
echo "良好"
elif [ $score -ge 70 ];then
echo "一般"
else
echo "很差"
fi
- if结合元字符使用
vim c.txt
# !/bin/bash
read -p "输入用户名:" name
read -p "输入密码:" passwd
if [ $name = "nana" ] && [ $passwd = "123" ];then
echo "登陆成功"
else
echo "用户名或密码不正确"
fi
while循环
-
什么是循环
让计算机重复做某件事 -
为何要用循环
解决代码的冗余问题 -
如何用循环
- 多行
while 条件
do
命令1
命令2
命令3
done
- 写成一行
while 条件;do 命令1;命令2;命令3; done
while true;do ifconfig eth0;sleep 1;clear;done 每隔1秒刷新一次eth0网卡信息(clear:清屏)
写成一行,需要用分号(;)进行隔开
- while循环案例
vim c.txt
#!/bin/bash
while true
do
read -p "输入用户名:" inp_user
read -p "输入密码:" inp_pwd
if [ $inp_user = "egon" ] && [ $inp_pwd = "123" ];then
echo "登录成功"
break
else
echo "用户名或者密码错误"
fi
done
for循环
vim d.txt
# !/bin/bash
for i in {2..254}
do
(
ping -c1 1.1.1.$i &>/dev/null
if [ $? -eq 0 ];then
echo "1.1.1.$i ok"
else
echo "1.1.1.$i down"
fi
)&
done
不加()&,我们的代码是串行的,效率很低。
我们通过加()&,解决了for循环的效率问题,这种运行代码的方式,等同于在后台并发运行了252个子进程。
- ( &)与 ( )&的差别
(ping www.baidu.com &) 开启一个孤儿进程
(ping www.baidu.com)& 在当前这个进程里面运行开启一个子进程,并且把这个子进程放入后台
(ping www.baidu.com) 占用当前终端开启一个子进程