shell主要用来办公自动化,简化运维管理员的操作的。只要实现功能就可以,不需要考虑代码的简介和运行效率(因为这种脚本只有管理员一个人用)
写多分支if时需要注意的:
1、涉及到使用$调用变量一定要用双引括起来
2、判断使用的[]俩边要留有空格
3、等号2边可不可以有空格我也忘了,在测吧
4、定义变量时,直接赋给字符串。调用时才加$
5、运算时是$(()) 2个小括号;调用系统命令时要用$()括起来
6、Echo 时,如果有变量或函数 不要带中文;输出函数时要用()一个小括号括起来
7、只有else里才不用写then (if和elif里都要写)
我的理解是:下表的参数,就相当于是PHP的内置函数,标蓝的是常用的
1、按照文件类型进行判断
注意:语法俩边要加空格,该指令可以在shell下直接使用,也可以写在shell脚本中
使用&&和||,就不用每次echo $?看结果了
2、按照文件权限进行判断
3、俩个文件之间进行比较
4、俩个整数之间比较
因为加了-ge等这些操作符,所以bash会给他自动转为数值,而不是拿他当字符串
5、字符串的判断
注意:前俩是操作变量的,后面这俩也可以给变量使用。在shell脚本中调这变量一定要加双引号
6、多重条件(逻辑)判断(表达式用的)
单分支if
学习编程思维的思路:
写条件表达式的思路:先给要判断的条件在shell中以命令的形式执行一遍,看看效果对不对,对咯在写
#!/bin/bash #判断登录的是否为root用户 #思路:环境变量里找USER行,拿等号分割,截取第2列 test=$(env | grep "USER" | cut -d "=" -f 2) if [ "$test" == 'root' ] then echo '是root用户'; fi
#!/bin/bash #判断分区使用率 #思路:分区 | 取 /dev/vda1 | 取第5列 | 去掉% rate=$(df -h | grep "/dev/vda1" | awk '{print $5}' | cut -d "%" -f 1) if [ $rate -gt 10 ] then echo '警告!/dev/vda1 使用率高于10%' fi
双分支if
#!/bin/bash #如果根目录下的root目录存在 if [ -d /root ] then echo '存在' else echo '不存在' fi
#!/bin/bash #判断Nginx是否启动 #思路:截取Nginx的进程,-v取反,不取反的话,即使service Nginx stop停止之后,还是会有个grep Nginx test=$(ps aux | grep Nginx | grep -v grep) if [ -n "$test" ] #不为空 then echo "$(date) Nginx ok" >> /tmp/autostart-info.log else service Nginx start $> /dev/null #正确和错误的输出,都丢到/dev/null里不管 echo "$(date) restart ok" >> /tmp/autostart-err.log fi
多分支if
计算器思路:
2、判断用户输入的是否为数字
3、判断输入的运算符,是否合法
4、进行运算,返回结果
#接收用户输入的参数,给变量 read -t 30 -p '请输入数字1:' num1 read -t 30 -p '请输入数字2:' num2 read -t 30 -p '请输入运算符:' ope #判断3个变量是否为空 if [ -n "$num1" -a -n "$num2" -a -n "$ope" ] then #不为空 #判断用户输入的是否为数字。将$num1的值给sed替换,能替换成空证明是数字 test1=$(echo "$num1" | sed 's/[0-9]//g') test2=$(echo "$num2" | sed 's/[0-9]//g') #如果接收到的变量是空的,证明上一步替换成功,用户输入的是数字 if [ -z "$test1" -a -z "$test2" ] then #用户输入的是数字 if [ "$ope" == '+' ] then sum=$(($num1 + $num2)) elif [ "$ope" == '-' ] then sum=$(($num1 - $num2)) elif [ "$ope" == '*' ] then sum=$(($num1 * $num2)) elif [ "$ope" == '/' ] then sum=$(($num1 / $num2)) else echo '输出的运算符我不认识'; exit 400 #退出程序,返回错误代码400 fi else echo '输入的不是数字' exit 401 fi else echo '有变量未传值' exit 402 fi echo "$num1 $ope $num2 = $sum " #输出结果
#!/bin/bash #判断用户输入的是什么文件 #思路:接收键盘的输入,并赋给变量file(白色字儿) read -p "请输入文件名:" file if [ -z "$file" ] #判断变量是否为空 then #为空才进来 echo "您没有输入文件名" exit 400 elif [ ! -e "$file" ] #该文件不存在 then echo "该文件不存在" exit 401 elif [ -f "$file" ] #是普通文件 then echo "$file is a regulare file" elif [ -d "$file" ] #判断是否为目录 then echo "$file is a 目录" else echo "你进入了else" fi
注意:这个带双分号;默认的*不要带引号
#!/bin/bash #判断用户输入的是什么 read -p "请输入yes或no:" -t 30 cho #接收用户输入的值 case "$cho" in #相当于PHP中的switch "yes") #相当于PHP中switch里的case echo "同意安装该软件" ;; "no") echo "终止安装该软件" ;; *) #相当于PHP中switch里的default echo "请输入正确的" ;; esac
for循环
#!/bin/bash #循环5次,每次把值赋给i变量 for i in 1 2 3 4 5 do echo $i done
#!/bin/bash #批量解压缩 cd /root/dll/ #切换进待解压缩的目录 #原理:将待解压的压缩包名,写到一个日志里,读取这个日志,进行解压缩 ls *.tar.gz > tar.log #第一个是覆盖,防止log日志里有东西 ls *.tgz >> tar.log #追加,他会自己换行 for i in $( cat tar.log ) #读取待解压的压缩包名 do tar xzvf $i #解压 done rm -rf /root/dll/tar.log
注意:这个传统for循环是俩个(())
#!/bin/bash #传统for循环 从1加到100 s=0 for((i=1;i<=100;i=i+1)) do s=$(($s+$i)) done echo "从1加到100的结果是:"$s
while循环和until循环
注意:while容易造成死循环,推荐使用for
#!/bin/bash #从1加到100 i=1 s=0 while [ $i -le 100 ] #$i小于100 do s=$(( $s+$i )) i=$(( $i+1 )) done echo '从1+到100的结果是='$s
#!/bin/bash #从1加到100 i=1 s=0 #和while相比,直接改-gt这符号,就达到了取反的效果 until [ $i -gt 100 ] #$i大于100,条件不成立,则循环。 do s=$(( $s+$i )) i=$(( $i+1 )) done echo '从1+到100的结果是='$s