shell编程学习笔记6--条件判断循环与流程控制

shell主要用来办公自动化,简化运维管理员的操作的。只要实现功能就可以,不需要考虑代码的简介和运行效率(因为这种脚本只有管理员一个人用)


写多分支if时需要注意的:

1、涉及到使用$调用变量一定要用双引括起来

2、判断使用的[]俩边要留有空格

3、等号2边可不可以有空格我也忘了,在测吧

4、定义变量时,直接赋给字符串。调用时才加$

5、运算时是$(()) 2个小括号;调用系统命令时要用$()括起来

6、Echo 时,如果有变量或函数 不要带中文;输出函数时要用()一个小括号括起来

7、只有else里才不用写then ifelif里都要写)

8、错误才加exit终止程序,并返回错误码


我的理解是:下表的参数,就相当于是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


计算器思路:

1、效验用户有无输入内容

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


多分支case语句(相当于php的switch)



注意:这个带双分号;默认的*不要带引号

#!/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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2280端口映射到公网,发现经常被暴力破解,自己写了个临时封禁ip功能的脚本,实现5分钟内同一个ip登录密码错误10次就封禁这个ip5分钟,并且进行邮件通知使用步骤openwrt为19.07.03版本,其他版本没有测试过安装bashmsmtpopkg
#!/bin/bashcommand1&command2&wait从Shell脚本并行运行多个程序–杨河老李(kviccn.github.io)
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/phpls-ls 2.编辑修改.bash_profile文件(没有.bash_profile文件的情况下回自动创建)sudovim~/.bash_profile在文件的最后输入以下信息,然后保存退出exportPATH="/Applications/MAMP/bin/php/php7.2.20/b
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如zh_CN之类的语言包,进行中文语言包装:apt-getinstalllanguage-pack-zh-hans3、安装好后我们可以进行临时修改:然后添加中文支持: locale-genzh_CN.UTF-8临时修改> export LC_ALL='zh_CN.utf8'> locale永久
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexadecimalbash2#[0~1]0[0~7]0x[0~f]or0X[0~f]perl0b[0~1]0[0~7]0x[0~f]tcl0b[0~1]0o[0~7]0x[0~f]bashdifferentbaserepresntationreference2.StringlengthLanguageStr
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全命令补全方法:yum-yinstallbash-completionsource/usr/share/bash-completion/bash_completionsource<(kubectlcompletionbash)echo"source<(kubectlcompletionbash)">>~/.bashrc 
参考这里启动jar包shell脚本修改过来的#!/bin/bash#默认应用名称defaultAppName='./gadmin'appName=''if[[$1&&$1!=0]]thenappName=$1elseappName=$defaultAppNamefiecho">>>>>>本次重启的应用:$appName<
#一个数字的行#!/bin/bashwhilereadlinedon=`echo$line|sed's/[^0-9]//g'|wc-L`if[$n-eq1]thenecho$linefidone<1.txt#日志切割归档#!/bin/bashcd/data/logslog=1.logmv_log(){[-f$1]&&mv$1$2
#文件增加内容#!/bin/bashn=0cat1.txt|whilereadlinedon=[$n+1]if[$n-eq5]thenecho$lineecho-e"#Thisisatestfile.\n#Testinsertlineintothisfile."elseecho$linefidone#备份/etc目录#
# su - oraclesu: /usr/bin/ksh: No such file or directory根据报错信息:显示无法找到文件 /usr/bin/ksh果然没有该文件,但是发现存在文件/bin/ksh,于是创建了一个软连接,可以规避问题,可以成功切换到用户下,但无法执行系统自带命令。$. .bash_profile-ksh: .: .b
history显示历史指令记录内容,下达历史纪录中的指令主要的使用方法如果你想禁用history,可以将HISTSIZE设置为0:#exportHISTSIZE=0使用HISTIGNORE忽略历史中的特定命令下面的例子,将忽略pwd、ls、ls-ltr等命令:#exportHISTIGNORE=”pwd:ls:ls-ltr:”使用HIS
一.命令历史  1.history环境变量:    HISTSIZE:输出的命令历史条数,如history的记录数    HISTFILESIZE:~/.bash_history保存的命令历史记录数    HISTFILLE:历史记录的文件路径    HISTCONTROL:     ignorespace:忽略以空格开头的命令
之前在网上看到很多师傅们总结的linux反弹shell的一些方法,为了更熟练的去运用这些技术,于是自己花精力查了很多资料去理解这些命令的含义,将研究的成果记录在这里,所谓的反弹shell,指的是我们在自己的机器上开启监听,然后在被攻击者的机器上发送连接请求去连接我们的机器,将被攻击者的she
BashOne-LinersExplained,PartI:Workingwithfileshttps://catonmat.net/bash-one-liners-explained-part-oneBashOne-LinersExplained,PartII:Workingwithstringshttps://catonmat.net/bash-one-liners-explained-part-twoBashOne-LinersExplained,PartII
Shell中变量的作用域:在当前Shell会话中使用,全局变量。在函数内部使用,局部变量。可以在其他Shell会话中使用,环境变量。局部变量:默认情况下函数内的变量也是全局变量#!/bin/bashfunctionfunc(){a=99}funcecho$a输出>>99为了让全局变量变成局部变量
1、多命令顺序执行;  命令1;命令2  多个命令顺序执行,命令之间没有任何逻辑联系&&  命令1&&命令2  逻辑与,当命令1正确执行,才会执行命令2||  命令1||命令2  逻辑或,当命令1执行不正确,才会执行命令2例如:ls;date;cd/home/lsx;pwd;who ddif=输入文件of=输
原博文使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗?首先,这个符号(#!)的名称,叫做"Shebang"或者"Sha-bang"。Linux执行文件时发现这个格式,会把!后的内容提取出来拼接在脚本文件或路径之前,当作实际执行的命令。 Shebang这个符号通常在Unix系统的脚本
1、历史命令history[选项][历史命令保存文件]选项:-c:  清空历史命令-w:  把缓存中的历史命令写入历史命令保存文件 ~/.bash_historyvim/etc/profile中的Histsize可改存储历史命令数量历史命令的调用使用上、下箭头调用以前的历史命令使用“!n”重复执行第n条历史
目录1.Shell脚本规范2.Shell脚本执行3.Shell脚本变量3.1环境变量3.1.1自定义环境变量3.1.2显示与取消环境变量3.1.3环境变量初始化与对应文件的生效顺序3.2普通变量3.2.1定义本地变量3.2.2shell调用变量3.2.3grep调用变量3.2.4awk调用变量3.3
   http://www.voidcn.com/blog/wszzdanm/article/p-6145895.html命令功能:显示登录用户的信息命令格式:常用选项:举例:w显示已经登录的用户及正在进行的操作[root@localhost~]#w 11:22:01up4days,21:22, 3users, loadaverage:0.00,0.00,0.00USER