元字符 if判断 while循环 for循环

元字符

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判断

  1. 什么是if判断
    依据条件的真假来决定是否做某事

  2. 为何要有if判断
    为了让计算机啊能够像人意义去做判断

  3. 如何用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循环

  1. 什么是循环
    让计算机重复做某件事

  2. 为何要用循环
    解决代码的冗余问题

  3. 如何用循环

- 多行
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)			占用当前终端开启一个子进程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值