当前位置:首页 > 生活百科

shell脚本语言的优势(shell脚本基本语法)

栏目:生活百科日期:2025-05-18浏览:0

4.1 条件选择

4.1.1 选择执行if语句

格式:

if COMMANDS; then COMMANDS; &[ elif COMMANDS; then COMMANDS; ]... &[ elseCOMMANDS; ] fi

单分支

if 判断条件;then  条件为真的分支代码fi

双分支

if 判断条件; then    条件为真的分支代码else    条件为假的分支代码fi

多分支

if 判断条件1; then    条件1为真的分支代码elif 判断条件2; then    条件2为真的分支代码elif 判断条件3; then    条件3为真的分支代码...else    以上条件都为假的分支代码fi

说明:

多个条件时,逐个条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句

if 语句可嵌套

范例:

#根据命令的退出状态来执行命令if ping -c1 -W2 station1 &&&> /dev/null; then      echo 'station1 is UP' elif grep -q 'station1' ~/maintenance.txt; then      echo 'station1 is undergoing maintenance'else     echo 'station1 is unexpectedly DOWN!'      exit 1fi

范例:

&[root@centos8 ~]#cat if_bmi.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2019-12-25#FileName: if_bmi.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2019 All rights reserved#********************************************************************read -p "请输入身高(m为单位): " HIGHif &[&[ ! "$HIGH" =~ ^&[0-2].?&[0-9]{,2}$ ]];then echo "输入错误的身高"; exit 1; firead -p "请输入体重(kg为单位): " WEIGHTif &[&[ ! "$WEIGHT" =~ ^&[0-9]{1,3}$ ]];then echo "输入错误的体重"; exit 1; fiBMI=`echo $WEIGHT/$HIGH^2|bc`if &[ $BMI -le 18 ] ;then    echo "你太瘦了,多吃点"elif &[ $BMI -lt 24 ] ;then    echo "身材很棒!"else    echo "你太胖了,注意节食,加强运动"fi

4.1.2 条件判断case语句

格式:

case WORD in &[PATTERN &[| PATTERN]...) COMMANDS ;;]... esac
case 变量引用 inPAT1)    分支1     ;;PAT2)    分支2     ;;...*)    默认分支     ;;esac

case支持glob风格的通配符:

*: 任意长度任意字符

?: 任意单个字符

[]:指定范围内的任意单个字符

|: 或,如 a或b

范例:

&[root@centos8 script40]#cat case_yesorno.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2019-12-25#FileName: case_yesorno.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2019 All rights reserved#********************************************************************read -p "Do you agree(yes/no)? " INPUTINPUT=`echo $INPUT | tr 'A-Z' 'a-z'`case $INPUT iny|yes)   echo "You input is YES"   ;;n|no)   echo "You input is NO"   ;;*)   echo "Input fales,please input yes or no!"esac&[root@centos8 script40]#cat case_yesorno2.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2019-12-25#FileName: case_yesorno.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2019 All rights reserved#********************************************************************read -p "Do you agree(yes/no)? " INPUTcase $INPUT in&[yY]|&[Yy]&[Ee]&[Ss])   echo "You input is YES"   ;;&[Nn]|&[Nn]&[Oo])   echo "You input is NO"   ;;*)   echo "Input fales,please input yes or no!"esac

练习

编写脚本 createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息编写脚本 yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息编写脚本 fifiletype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)编写脚本 checkint.sh,判断用户输入的参数是否为正整数

4.2 循环

4.2.1 循环执行介绍

将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件

重复运行次数

循环次数事先已知

循环次数事先未知

常见的循环的命令:for, while, until

4.2.2 for循环

格式1:

for 变量名 in 列表;do        循环体done

执行机制:

依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束

for循环列表生成方式:

直接给出列表整数列表:

{start..end}$(seq &[start &[step]] end)

返回列表的命令:

$(COMMAND)

使用glob,如:*.sh变量引用,如:$@,$#

范例: 九九乘法表

#!/bin/bashfor i in {1..9};do    for j in `seq $i`;do        echo -e "${j}x${i}=$&[i*j]tc"    done    echodone

范例:生产案例

&[root@centos8 ~]#cat /data/script40/for_rename.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: /data/script40/for_rename.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************DIR=/data/testcd $DIRfor FILE in * ;do  PRE=`echo $FILE | sed -nr 's/(.*).(&[^.]+)$/1/p'`#  SUFFIX=`echo $FILE | sed -nr 's/(.*).(&[^.]+)$/2/p'`  mv $FILE $PRE.bakdone

范例:M37期面试题,要求将目录YYYY-MM-DD/中所有文件,移动到YYYY-MM/DD/下

#1 yyyy-mm-dd10.sh 创建YYYY-MM-DD,当前日期一年前365天到目前共365个目录,里面有10个文件,$RANDOM.log&[root@centos8 ~]#cat dir20.sh#!/bin/bashfor i in {1..365};do      DIR=`date -d "-$i day" +%F`      mkdir $DIR      cd $DIR      for n in {1..10};do      touch $RANDOM.log      done      cd ..done#2 移动到YYYY-MM/DD/下 #!/bin/bash#DIR=/data/testcd $DIRfor DIR in * ;do    YYYY_MM=`echo $DIR |cut -d"-" -f1,2`    DD=`echo $DIR |cut -d"-" -f3`    &[ -d $YYYY_MM/$DD ] || mkdir -p $YYYY_MM/$DD &&&> /dev/null    mv $DIR/*  $YYYY_MM/$DDdone

格式2

双小括号方法,即((…))格式,也可以用于算术运算,双小括号方法也可以使bash Shell实现C语言风格

的变量操作

I=10;((I++))

for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))do 循环体done

说明:

控制变量初始化:仅在运行到循环代码段时执行一次

控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做条件判断

范例:

#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: for_sum2.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************for((sum=0,i=1;i&<=100;sum+=i,i++));do                truedoneecho $sum

范例:九九乘法表

#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: for_99_2.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************for ((i=1;i&<10;i++));do  for((j=1;j&<=i;j++));do        echo -e "${j}x${i}=$&[i*j]tc"  done  echo done

练习:用 for 实现

判断/var/目录下所有文件的类型添加10个用户user1-user10,密码为8位随机字符/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34fifilename stop S66fifilename start编写脚本,提示输入正整数n的值,计算1+2+…+n的总和计算100以内所有能被3整除的整数之和编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态打印九九乘法表在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html打印等腰三角形

10、猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子了。求第一天共摘了多少?

4.2.3 while循环

格式:

while CONDITION; do         循环体done

说明:

CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环,因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正

进入条件:CONDITION为true

退出条件:CONDITION为false

范例:

#配置发邮件的邮箱&[root@centos8 ~]#cat .mailrc set from=29308620@qq.comset smtp=smtp.qq.comset smtp-auth-user=29308620@qq.comset smtp-auth-password=esvnhbnqocirbicfset smtp-auth=loginset ssl-verify=ignore&[root@centos8 ~]#cat while_diskcheck.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: while_diskcheck.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reservedWARNING=80while :;do  USE=`df | sed -rn '/^/dev/sd/s#.* (&[0-9]+)%.*#1#p' |sort -nr|head -n1`  if &[ $USE -gt $WARNING ];then   echo Disk will be full from `hostname -I` | mail -s "disk warning"29308620@qq.com  fi  sleep 10done

练习:用while实现

编写脚本,求100以内所有正奇数之和编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和离线主机各多少编写脚本,打印九九乘法表编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大值和最小值编写脚本,实现打印国际象棋棋盘后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令: echo $RANDOM|md5sum|cut –c1-10后的结果,请破解这些字符串对应的RANDOM值

无限循环

while true; do         循环体done

4.2.4 until循环

格式:

until CONDITION; do         循环体done

说明:

进入条件: CONDITION 为false

退出条件: CONDITION 为true

无限循环

until false; do         循环体Done

4.2.4 循环控制语句 continue

continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层

格式:

while CONDITION1; do     CMD1 ... if CONDITION2; then  continue fi CMDn ...done

范例:

&[root@centos8 script40]#cat continue_for.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: continue_for.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************for ((i=0;i&<10;i++));do    for((j=0;j&<10;j++));do               &[ $j -eq 5 ] &&&& continue 2               echo $j     done     echo ---------------------------done&[root@centos8 script40]#bash continue_for.sh01234012340123401234012340123401234012340123401234

4.2.5 循环控制语句 break

break [N]:提前结束第N层整个循环,最内层为第1层

格式:

while CONDITION1; do    CMD1 ...  if CONDITION2; then    break    fi    CMDn    ...done

范例:

&[root@centos8 script40]#cat break_for.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: continue_for.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************for ((i=0;i&<10;i++));do    for((j=0;j&<10;j++));do         &[ $j -eq 5 ] &&&& break          echo $j    done    echo ---------------------------done

范例:

&[root@centos8 script40]#cat break_for.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: continue_for.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************for ((i=0;i&<10;i++));do    for((j=0;j&<10;j++));do         &[ $j -eq 5 ] &&&& break 2         echo $j    done    echo ---------------------------done&[root@centos8 script40]#bash break_for.sh01234

范例:

&[root@centos8 script40]#cat menu.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: menu.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************sum=0COLOR='echo -e 33&[1;31m'COLOR2='echo -e 33&[1;32m'END="33&[0m"while true;doecho -e "33&[33;1mc"cat &<&<EOF1) 鲍鱼2) 满汉全席3) 龙虾4) 燕窝5) 帝王蟹6) 退出EOFecho -e "33&[0m"read -p "请点菜: " MENUcase $MENU in1|4)  $COLOR'菜价: $10'$END  let sum+=10  ;;3|5)  $COLOR'菜价: $20'$END  let sum+=20  ;;2)  $COLOR'菜价: $1000'$END  let sum+=1000  ;;6)  $COLOR2"你点的菜总价格是 $sum"$END  break  ;;*)  echo "点错了,没有这道菜"  ;;esac$COLOR2"你点的菜总价格是 $sum"$ENDdone

范例:

&[root@centos8 script40]#cat guess.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: guess.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************NUM=$&[RANDOM%10]while read -p "输入 0-9 之间的数字: " INPUT ;do if &[ $INPUT -eq $NUM ];then echo "恭喜你猜对了!" break elif &[ $INPUT -gt $NUM ];then    echo "数字太大了,重新猜!" else    echo "数字太小了,重新猜!"  fidone

4.2.6 循环控制 shift 命令

shift [n] 用于将参量列表 list 左移指定次数,缺省为左移一次。

参量列表 list 一旦被移动,最左端的那个参数就从列表中删除。while 循环遍历位置参量列表时,常用到 shift

范例:doit.sh

#!/bin/bash# Name: doit.sh# Purpose: shift through command line arguments# Usage: doit.sh &[args]while &[ $You can't use 'macro parameter character #' in math mode# -gt 0 ] # or (( $# &> 0 ))do        echo $*        shiftdone./doit.sh a b c d e f g h

范例:示例:shift.sh

#!/bin/bash#step through all the positional parametersuntil &[ -z "$1" ] do        echo "$1"        shiftdoneecho  ./shfit.sh a b c d e f g h

范例:

&[root@centos8 script40]#vim shift_batch_user.sh #!/bin/bash##********************************************************************#Author:        wangxiaochun#QQ:          29308620#Date:         2020-01-03#FileName:       shift_batch_user.sh#URL:          http://www.magedu.com#Description:     The test script#Copyright (C):     2020 All rights reserved#********************************************************************if &[ $# -eq 0 ];then  echo "Usage: `basename $0` user1 user2 ..."  exitfi                                                                                      while &[ "$1" ];do    if id $1 &&&> /dev/null;then      echo $1 is exist    else      useradd $1      echo "$1 is created"    fi    shiftdoneecho "All user is created"&[root@centos8 script40]#bash shift_batch_user.shUsage: shift_batch_user.sh user1 user2 ...&[root@centos8 script40]#bash shift_batch_user.sh tom alice jacktom is existalice is existjack is createdAll user is created

练习

每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并退出脚本随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出用文件名做为参数,统计所有参数文件的总行数用二个以上的数字为参数,显示其中的最大值和最小值

4.2.7 while read 特殊用法

while 循环的特殊用法,遍历文件或文本的每一行

格式:

while read line; do        循环体done &< /PATH/FROM/SOMEFILE

说明:依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

范例:

&[root@centos8 ~]#echo magedu | read X ; echo $X&[root@centos8 ~]#echo magedu | while read X ; do echo $X;donemagedu&[root@centos8 ~]#echo magedu | { read X ; echo $X; }magedu&[root@centos8 ~]#echo magedu | ( read X ; echo $X )magedu&[root@centos8 ~]#echo mage wang zhang | ( read X Y Z; echo $X $Y $Z )mage wang zhang&[root@centos8 ~]#echo mage wang zhang | while read X Y Z; do echo $X $Y $Z;donemage wang zhang

范例:

cat while_read_diskcheck.sh#!/bin/bashWARNING=80MAIL=root@wangxiaochun.comdf |sed -nr "/^/dev/sd/s#^(&[^ ]+) .* (&[0-9]+)%.*#1 2#p"|while read DEVICE USE;do    if &[ $USE -gt $WARNING ] ;then         echo "$DEVICE will be full,use:$USE" | mail -s "DISK WARNING" $MAIL    fidone

范例:

cat while_read_check_dos.sh#!/bin/bash##********************************************************************#Author: wangxiaochun#QQ: 29308620#Date: 2020-01-03#FileName: while_read_check_dos.sh#URL: http://www.magedu.com#Description: The test script#Copyright (C): 2020 All rights reserved#********************************************************************lastb | sed -rn '/ssh:/s@.* (&[0-9.]{1,3}{3}&[0-9]{1,3}) .*@1@p'|sort |uniq -c|while read count ip ;do     if &[ $count -gt 3 ];then        iptables -A INPUT -s $ip -j REJECT    fi done

范例:

cat while_read_passwd.sh#!/bin/bash##********************************************************************#Author:        wangxiaochun#QQ:          29308620#Date:         2020-01-03#FileName:       while_read_passwd.sh#URL:          http://www.magedu.com#Description:     The test script#Copyright (C):     2020 All rights reserved#********************************************************************while read line ;do    if &[&[ "$line" =~ /sbin/nologin$ ]] ;then        echo $line | cut -d: -f1,3    fi                                                    done &< /etc/passwd

4.2.8 select 循环与菜单

格式:

select variable in list ;do         循环体命令done

说明:

select 循环主要用于创建菜单,按数字顺序排列的菜单项显示在标准错误上,并显示 PS3 提示符,等待用户输入用户输入菜单列表中的某个数字,执行相应的命令用户输入被保存在内置变量 REPLY 中select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 命令终止脚本。也可以按ctrl+c 退出循环select 经常和 case 联合使用与 for 循环类似,可以省略 in list,此时使用位置参量

范例:

cat select.sh #!/bin/bash#sum=0PS3="请点菜(1-6): "select MENU in 北京烤鸭 佛跳墙 小龙虾 羊蝎子 火锅 点菜结束;docase $REPLY in1)     echo $MENU 价格是 100     let sum+=100     ;;2)     echo $MENU 价格是 88     let sum+=88     ;;3)      echo $MENU价格是 66      let sum+=66      ;;4)      echo $MENU 价格是 166      let sum+=166      ;;5)      echo $MENU 价格是 200      let sum+=200      ;;6)      echo "点菜结束,退出"      break      ;;*)      echo "点菜错误,重新选择"      ;;esacdoneecho "总价格是: $sum"

“shell脚本语言的优势(shell脚本基本语法)” 的相关文章

佳能mp280清零方法(canonmp280使用说明)

微距摄影是非常受欢迎的摄影题材,但是微距镜头发展时间并不长。有句话叫“微距无弱旅”,由于微距镜头的拍摄特殊性,因此微距镜头虽然光圈不会很大,但是都有很好的锐度表...

免费建站哪个最好,最好用的免费建站平台推荐

面对互联网大量的免费建站广告,让很多想通过网站进行营销的企业和个人心动,那么,免费建站真的好吗?现在就和大家分享一下搜索引擎优化的最好的免费建站网站,通过对这些...

pr字幕怎么做流光效果(批量加字幕的快捷方法)

我今天才发现,一键给视频添加好看的字幕,原来这么简单经常在网上看到,不少懂得剪辑的朋友,将自己的旅行视频制作的和电影影片一样,里面不仅有非常高级好看的字幕,还有...

5万元创业项目推荐,月入3万的10个小生意

男士内衣店A都说女人的钱好赚,大多数服装厂家和商家将主要精力投入到女性市场,男性市场一直处于被忽略的状态。国外不少厂商瞄准大陆市场的这一盲区,大力抢占市常他们通...

foxmail最新版本是多少(2分钟教你foxmail邮箱安装步骤)

Foxmail7.2存储电子邮件的位置,在安装目录下的FMStorage.list文件中,用文本编辑器(记事本、Notepad++等等)打开就可以看到邮件存储路...

创业平台有哪些,收益最高的十大创业平台排行

洋葱O&’MALLO&’MALL,GIVEYOUMORE洋葱O&’MALL成立于2014年,凭借创新的M2S(MadetoS...

免杀工具包用的什么软件(2023免杀教程)

人工智能的飞速发展正在将世界带入一个全新的维度,但这同时也将网络世界的正邪对抗推入下一个战场。美国当地时间8月10日,由GeekPwn主办的CAADVillag...

nvidia控制面板怎么打开,win10打开nvidia控制面板的三

电脑打不开NVIDIA控制面板怎么办?如果要对显卡显示参数进行设置,都需要进入NVIDIA控制面板,但是有用户反映,电脑一直无法打开NVIDIA控制面板,这是怎...

ktv点歌软件叫什么(电脑安装ktv点歌系统操作方法)

目前的KTV点歌台不仅触屏功用简单出现问题,而且输入法极端费劲严重影响了唱歌体验。点歌系统app开发致力于带给用户自然流通的K歌体验,以特别的混响音效充分发...

什么手机有nfc功能在哪里(nfc功能介绍及使用)

本文章是实操教程,相关原理可以百度了解,相同的软硬件可以按照文章老操作,软硬件不一致可以参考,不保证百分之百成功。硬件是我自己花钱购买的,购买后有给办公室和小区...