Shell编程之循环语甸与函数

for  遍历循环

1)for 变量  in  取值列表
for i in  $(seq 1 10)
do
    命令序列
    ....
done

2)for ((变量=初始值; 变量范围; 变量的迭代方式))
for ((i=1; i<=10; i++))
do
    命令序列
    ....
done


IFS  for循环取值列表分隔符 
set | grep IFS  -->  IFS=$' \t\n'    默认包含 空格、制表符、换行符

求字符串分片  ${变量:下标:长度}     #下标从0开始
求字符串长度  ${#变量}
求随机数      $RANDOM         #0~32767
求0到N-1之间的随机数    $[RANDOM % N]   

for循环实现多线程
for ((i=1; i<=10; i++))
do
  {
    命令序列
     ....
  }&          #将每次循环的进程都放入后台自行运行
done
wait          #等待上面所有循环的进程都执行完毕后再执行后面的命令
命令序列

    

vim /etc/passwd

禁用当前系统除了root用户以外的可登录用户

查看可登录用户

过滤root用户

 除了root用户以外的可登录用户


ip

cat result.txt

查询结果

wang前追加

往后追加

小写转大写


for in 循环


创建用户 

 ` ` 和 ( )效果一样的·

修改密码 


批量添加用户,用户名存放在users.txt文件中,每行一个,初始密码均设为123456 

#!/bin/bash
#批量添加用户,用户名存放在users.txt文件中,每行一个,初始密码均设为123456
userfile=/root/users.txt

for name in $(cat $userfile)
do
  useradd $name
  echo 123456 | passwd --stdin $name &> /dev/null
done 

echo "批量添加用户完成"

禁用当前系统除了root用户以外的可登录用户 

#!/bin/bash
#禁用当前系统除了root用户以外的可登录用户

usrname=$(cat /etc/passwd | grep "/bin/bash$" | grep -v "^root" | awk -F: '{print $1}')

for iname in $usrname
do
    #echo $iname
    usermod -L $iname
done

 根据IP地址检查主机状态 IP地址存放在ipadds.txt文件中,每行一个 使用ping命令检测各主机的连通性

#!/bin/bash
#根据IP地址检查主机状态 IP地址存放在ipadds.txt文件中,每行一个 使用ping命令检测各主机的连通性
filepath=/root/for/ipadds.txt

for hostip in $(cat $filepath)
do
    ping -c 4 -i 0.5 -W 2 $hostip &> /dev/null
    if [ $? -eq 0 ];then
        echo "$hostip is online" >> /root/for/result.txt
    else
        echo "$hostip is offline">> /root/for/result.txt
    fi
done

 根据IP地址检查主机状态 使用ping命令检测 192.168.80.10 20 30 40 50 60主机的连通性

#!/bin/bash
#根据IP地址检查主机状态 使用ping命令检测 192.168.80.10 20 30 40 50 60主机的连通性

for num in {1..6}
do
    hostip="192.168.80.${num}0"
    ping -c 4 -i 0.5 -W 2 $hostip &> /dev/null
    if [ $? -eq 0 ];then
      echo "$hostip is online"
    else
      echo "$hostip is offline"
    fi
done

用户名存放在users.txt文件中,每行一个,判断文件里的用户是否存在,若该用户存在,输出提示该用户已存在;用户存在但没设密码,则提示用户并让用户设置密码:若该用户不存在,提示用户输入密码,建立用户并设立其密码 

#!/bin/bash
#用户名存放在users.txt文件中,每行一个,判断文件里的用户是否存在,若该用户存在,输出提示该用户已存在;用户存在但没设密码,则提示用户并让用户设置密码:若该用户不存在,提示用户输入密码,建立用户并设立其密码

usrfile=/root/users.txt
#循环遍历文件里的每行用户
for iname in $(cat $usrfile)
do
  #判断是否存在
  grep "^$iname" /etc/passwd &> /dev/null
  if [ $? -eq 0 ];then
    echo "$iname 用户已存在"
    #判断用户是否设置密码
    userpasswd=$(cat /etc/shadow | grep "^$iname" | awk -F: '{print $2}')
    if [ "$userpasswd" == "!!" ] || [ "$userpasswd" == "*" ] || [ -z "$userpasswd" ];then
      echo "$iname 用户没设密码。"
      read -p "请设置 $iname 用户的密码:" pd1
      read -p "请确认设置 $iname 用户的密码:" pd2
        if [ "$pd1" == "$pd2" ];then
          echo $pd1 | passwd --stdin $iname &> /dev/null
        else
          echo "密码输入不正确,放弃设置...."   
        fi
    fi  
  else
    #创建不存在的用户并设置密码
    echo "$iname 用户不存在,正常创建用户....."
    read -p "请设置 $iname 用户的密码:" password1
    read -p "请确认设置 $iname 用户的密码:" password2
    if [ "$password1" == "$password2" ];then
      useradd $iname
      echo $password1 | passwd --stdin $iname &> /dev/null
    else
      echo "密码输入不正确,放弃设置...."   
    fi
  fi
done


 输出1到10的整数,并判断奇偶数

#!/bin/bash
#输出1到10的整数,并判断奇偶数

for ((i=1; i<=10; i++))
do
  a=$[i % 2]
  if [ $a -eq 1 ];then
    echo "$i 为奇数"   
  else
    echo "$i 为偶数"
  fi

done

求1到10的和

#!/bin/bash
#求1到10的和
sum=0
for ((i=1; i<=10; i++))
{
 sum=$[sum + $i] 
}
echo "1到10的和为 $sum"

猴子摘下了n个香蕉,当天吃掉一半多一个,第二天也是吃掉剩下香蕉一半多一个,到了第十天,香蕉只剩下了1个。问:猴子第一天摘了多少香蕉?

#!/bin/bash
#猴子摘下了n个香蕉,当天吃掉一半多一个,第二天也是吃掉剩下香蕉一半多一个,到了第十天,香蕉只剩下了1个。问:猴子第一天摘了多少香蕉?

n=1

for ((i=1; i<=9; i++))
do
   n=$[(n+1)*2]

done
   echo "第一天摘了 $n 个香蕉"

自动生成一个8位数的随机密码,密码范围可以是小大写字母和数字
 

#!/bin/bash
#自动生成一个8位数的随机密码,密码范围可以是小大写字母和数字

STR="0123456789shicaijundashuaigeABCDEFGHIJKLMNOPQRSTUVWXYZ"

for ((i=1; i<=8; i++))
do
   #获取字符串所有下标的随机数
   num=$[RANDOM % ${#STR}]
   #根据随机下标获取一个随机字符
   passd=${STR:num:1}
   #将随机字符进行拼接
   password+=$passd

done

echo "8位随机密码为 $password"

根据IP地址检查主机状态 使用ping命令检测 192.168.80.0~255 的主机,获取在线的主机清单

#!/bin/bash
#根据IP地址检查主机状态 使用ping命令检测 192.168.80.0~255 的主机,获取在线的主机清单

for num in {0..255}
do
  {
    hostip="192.168.80.$num"
    ping -c 4 -i 0.5 -W 2 $hostip &> /dev/null
    if [ $? -eq 0 ];then
      echo "$hostip is online" >> /root/host.txt
    fi
  }&
done
wait
cat /root/host.txt


 输出PATH环境变量的目录里所有以xy开头的文件

#!/bin/bash
#输出PATH环境变量的目录里所有以xy开头的文件

IFS_OLD=$IFS
IFS=$IFS':'

for i in $PATH
do
  #ls $i/xy* 2> /dev/null
  find $i -name "xy*" -print 2> /dev/null
done

求裴波拉切数:1,1,2,3,5,8,13,21,34,55,89...,数列从第3项开始每一项等于前两项之和,打印前10个元素

#!/bin/bash
#求裴波拉切数:1,1,2,3,5,8,13,21,34,55,89...,数列从第3项开始每一项等于前两项之和,打印前10个元素

first=1
second=1

for ((i=1; i<=10; i++))
do
  echo $first
  C=$[first + second]
  first=$second
  second=$C
done


输出PATH环境变量的目录里所有以se开头的文件

#!/bin/bash
#输出PATH环境变量的目录里所有以se开头的文件
IFS_OLD=$IFS
IFS=$IFS':'

for folder in $PATH
do
   find $folder -name "se*" 2> /dev/null

done

IFS=$IFS_OLD

求裴波拉切数列中的前十二个数值 

#!/bin/bash
#求裴波拉切数列中的前十二个数值
#前一个数
a=1 
#后一个数
b=1 


for i in {1..12}
do
  echo $a
  #获取第三个数值
  c=$[a + b]
  #设置下次的前一个数的值为原第二个数的值
  a=$b
  #设置下次的后一个数的值为原第三个数的值
  b=$c

done

使用循环语句将一个 0到255 之间的十进制数转换成8位数二进制数 

#!/bin/bash
#使用循环语句将一个 0到255 之间的十进制数转换成8位数二进制数
#减法正排
read -p "请输入一个0-255的整数:" num
#for i in 128 64 32 16 8 4 2 1
a=256
for ((i=1; i<=8; i++))
do
   a=$[a / 2]
   result=$[num - a]
   if [ $result -lt 0 ];then
      echo -n 0
   else
      echo -n 1
      let num-=$a	  
   fi
done
echo ''

请输入一个0-255的整数: 

#!/bin/bash

read -p "请输入一个0-255的整数:" num
for i in {1..8}
do
   yushu=$[num % 2]
   num=$[num / 2]
   
   result=$yushu$result
   
done
echo $result

while

 退出循环

设置猜测次数

 将一个200行的文件分割成多个50行的文件

#!/bin/bash
#将一个200行的文件分割成多个50行的文件

filepath=/root/day10/test.txt
#定义行数计数器变量
a=0
#定义文件序号变量
i=1

IFS_OLD=$IFS
IFS=$'\n'

for line in $(cat $filepath)
do
  let a++
  #判断是否已经读入50行,满50行则文件序号+1
  c=$[a % 50]
  if [ $c -eq 0 ];then
    echo $line >> /root/day10/test${i}.txt
    let i++
  else
    echo $line >> /root/day10/test${i}.txt
  fi
done

IFS=$IFS_OLD

 写个脚本实现 猜测0-999的随机价格,猜不中则一直猜


PRICE=$[RANDOM % 1000]
a=1
b=0
while [ $a -eq 1 ];
do
  read -p "请输入你猜测的价格(0-999):" NUM  
  let b++
  if [ $NUM -eq $PRICE ] && [ $b -le 5 ];then
    echo "恭喜!你猜中了!!"
    exit 0
  elif [ $NUM -gt $PRICE ] && [ $NUM -le 999 ];then
    if [ $b -lt 5 ];then
      echo "猜大了!!请重猜"
    else
      echo "真遗憾,猜测次数用完!"
      exit 1
    fi
  elif [ $NUM -le $PRICE ] && [ $NUM -ge 0 ];then
    if [ $b -lt 5 ];then
      echo "猜小了!!请重猜"
    else
      echo "真遗憾,猜测次数用完!"
      exit 2
    fi
  else
    echo "输入有误!请重新输入!!"
  fi
done

 批量添加用户 用户名称以stu开头,按数字顺序进行编号 一共添加20个用户,即stu1、stu2、……、stu20 初始密码均设为123456

#!/bin/bash
#批量添加用户 用户名称以stu开头,按数字顺序进行编号 一共添加20个用户,即stu1、stu2、……、stu20 初始密码均设为123456

i=1

while [ $i -le 20 ]
do
   useradd stu$i &> /dev/null
   echo 123456 | passwd --stdin stu$i > /dev/null
   echo "stu$i用户密码已创建完毕"
   let i++
done

计算从1到100所有整数的和  

#!/bin/bash
#计算从1到100所有整数的和

a=1
sum=0
read -p "请输入一个1到100的整数:" num
if [ $num -ge 1 ] && [ $num -le 100 ];then

  while [ $a -le $num ]
  do
    let sum+=a
    let a++

  done

  echo "1到100总和为$sum"

else
  echo "输入有误!"
fi

求从1到100所有整数的偶数和、奇数和 

#!/bin/bash
#求从1到100所有整数的偶数和、奇数和

a=1

jisum=0
ousum=0
while [ $a -le 100 ]
do
   b=$[a % 2]
   if [ $b -eq 0 ];then
     let ousum+=$a
   else
     let jisum+=$a
   fi
   let a++
done

echo -e "奇数和为 $jisum\n偶数和为 $ousum"

每10秒检查系统内存使用率是否超过80% 

#!/bin/bash
#每10秒检查系统内存使用率是否超过80%

while true
do
  memused=$(free | grep Mem | awk '{print $3}')
  memtotal=$(free | grep Mem | awk '{print $2}')

  usedpercent=$[memused * 100 / memtotal]

  if [ $usedpercent -ge 20 ];then
    echo "警告!当前系统内存使用率超过80%,当前使用率为 ${usedpercent}%"
  fi

  sleep 10
done

用while循环将一个200行的文件分割成多个50行的文件 

#!/bin/bash
#用while循环将一个200行的文件分割成多个50行的文件


filepath=/root/day10/test.txt
#定义行数计数器变量
a=0
#定义文件序号变量
i=1

cat $filepath | while read line
do
  let a++
  #判断是否已经读入50行,满50行则文件序号+1
  c=$[a % 50]
  if [ $c -eq 0 ];then
    echo $line >> /root/day10/test${i}.txt
    let i++
  else
    echo $line >> /root/day10/test${i}.txt
  fi
done

echo

until 循环

until [ 条件表达式 ]       until test 条件表达式        until 命令行 &> /dev/null      #条件不成立时才会循环执行do里面的命令序列
do
    命令序列
    ....
    变量的迭代方式
done

a=1
while [ $a -ge 10 ]
do
  echo $a
  let a++
done 

循环退出

exit     退出脚本进程      exit N    还可以指定脚本退出的状态返回码

break    跳出单个循环      break 2   跳出2层循环

continue  中止本次循环中的其它命令执行,但不会完全中止整个循环运行

for ((a=1; a<=6; a++))
do
    echo $a
    for ((b=1; b<=6; b++))
    do
        echo $b
        if [ $b -eq 3 ];then
            break
        fi
    
    done
done

 

A='11:22:33:44'
echo ${A%:*}  -->  11:22:33        #从最右边开始删内容,直到最近的一个 : 的位置
echo ${A%%:*} -->  11              #从最右边开始删内容,直到最远的一个 : 的位置
echo ${A#*:}  -->  22:33:44        #从最左边开始删内容,直到最近的一个 : 的位置
echo ${A##*:}  --> 44              #从最左边开始删内容,直到最远的一个 : 的位置 

 

 

#!/bin/bash

a=1
length=$(echo $PATH | awk -F: '{print NF}')

while [ $a -le $length ]
do
    folder=$(echo $PATH | awk -F: "{print \$$a}")
    find $folder -name "se*" 2> /dev/null
    let a++
done

将一个点分十进制格式的IP地址转换成点分二进制格式 

#!/bin/bash
#将一个点分十进制格式的IP地址转换成点分二进制格式
IP="192.168.80.30"

n=0

#外循环分割出IP的每段数值
for ((i=1; i<=4; i++))
do
     num=${IP%%.*}
     IP=${IP#*.}
     #echo $num
     #每次开始内循环前将result变量值清空 
     result=''
     #内循环使用余数倒排法进行数值转换
     for j in {1..8}
     do
         yushu=$[num % 2]
         num=$[num / 2]

         result=$yushu$result
     done
     let n++
     #使用n变量作为计数器,当n=4即转换IP的第4段数值后不再使用echo -n
     if [ $n -lt 4 ];then
         echo -n ${result}.
     else
         echo $result
     fi
done

输出PATH环境变量的目录里所有以se开头的不可执行文件

#!/bin/bash
#输出PATH环境变量的目录里所有以se开头的不可执行文件
IFS_OLD=$IFS
IFS=$IFS':'

for folder in $PATH
do
   file=$(find $folder -name "se*" 2> /dev/null)
   for i in $file
   do
       if [ ! -x $i ];then
           echo $i
       fi
   done
done

IFS=$IFS_OLD

 

#!/bin/bash

for ((a=1; a<=5; a++))
do
    echo "外循环a等于$a"
    for ((b=1; b<=5; b++))
    do
        echo -e "\t内循环b等于$b"
        if [ $b -ge 2 ] && [ $b -le 4 ];then
            continue
        fi
        echo -e "\t\tHello World"
    done
done

#!/bin/bash

a=1
while [ $a -le 5 ]
do
    echo "外循环a等于$a"
    let a++
    b=0
    while [ $b -lt 5 ]
    do
        let b++
        echo -e "\t内循环b等于$b"
        if [ $b -eq 3 ];then
            continue
        fi
        echo -e "\t\tHelloWorld"
    done
done

99乘法表

#!/bin/bash
#99乘法表

for ((second=1; second<=9; second++))
do
    for ((first=1; first<=second; first++))
    do  
       echo -n -e "${first}*${second}=$[first*second]\t"    
    done	
    echo ''
done

 

#!/bin/bash

a=1
while [ $a -le 9 ]
do
    b=1
    while [ $b -le $a ]
    do
        ji=$[a * b]
        echo -n -e "$a*$b=$ji\t"
        let b++
    done
    let a++
    echo ''
done

 输出由20个*组成的直线

#!/bin/bash
#输出由20个*组成的直线

for ((i=1; i<=20; i++))
do
    echo -n '*'

done
echo ''

输出长度为9个*,4行的矩形 

#!/bin/bash
#输出长度为9个*,4行的矩形

for ((a=1; a<=4; a++))
do
   for ((b=1; b<=9; b++))
   do
       echo -n '*'
   done
   echo ''
done

正直角三角形

#!/bin/bash
#正直角三角形

#外循环控制三角的行数
for ((a=9; a>=1; a--))
do
    #内循环控制每行输出的 * 的数量,第一行输出一个*,每行递增
    for ((b=9; b>=a; b--))
    do 
        echo -n "*"
    done
    echo ""
done

倒直角三角形 

#!/bin/bash
#倒直角三角形

#外循环控制行数
for ((a=1; a<=9; a++))
do
    #内循环控制每行输出的*数量,第一行输出最多,每行做递减
    for ((b=9; b>=a; b--))
    do
        echo -n "*"
    done
    echo ""
done

等腰三角形 

#!/bin/bash
#等腰三角形

read -p "请输入三角形的大小数值:" num

#控制三角形的行数
for ((a=1; a<=num; a++))
do
    #输出倒三角每行的空格数,第一行4个,第二行3个,每行做递减
    for ((i=num; i>a; i--))
    do
        echo -n " "
    done
    #输出等腰三角每行的*数,第一行输出1个,第二行3个,第三行5个,以此类推
    c=$[(a*2)-1]
    for ((b=1; b<=c; b++))
    do
        echo -n "*"
    done
    echo ""
done

倒等腰三角形,5行

#!/bin/bash
#倒等腰三角形,5行

#外循环控制三角的行数
for ((a=5; a>=1; a--))
do
    #输出空格正三角
    for ((b=5; b>a; b--))
    do
        echo -n " "
    done

    #输出倒等腰三角
    c=$[(a*2)-1]
    for ((i=1; i<=c; i++))    
    do
        echo -n "*"
    done
    echo ""
done

等腰三角形控制大小

菱形

#!/bin/bash
#菱形
read -p "请输入大小数值:" num

for ((a=1; a<=num; a++))
do
    for ((i=num; i>a; i--))
    do
        echo -n " "
    done
    c=$[(a*2)-1]
    for ((b=1; b<=c; b++))
    do
        echo -n "*"
    done
    echo ""
done


for ((a=num-1; a>=1; a--))
do
    #输出空格正三角
    for ((b=num; b>a; b--))
    do
        echo -n " "
    done

    #输出倒等腰三角
    c=$[(a*2)-1]
    for ((i=1; i<=c; i++))
    do
        echo -n "*"
    done
    echo ""
done

写个逛淘宝选购商品脚本,每家商店有五种商品选购(衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元),每次选购完或不买都会提示用户是否继续逛下一家商店,如果不再继续逛的话进行购物车结算总额。

#!/bin/bash
#写个逛淘宝选购商品脚本,每家商店有五种商品选购(衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元),每次选购完或不买都会提示用户是否继续逛下一家商店,如果不再继续逛的话进行购物车结算总额。

#店数的变量
n=1
#购物总额的变量
sum=0
while true
do
    echo "来到第${n}家商店的门口"
    read -p "是否进店逛逛?(yes/no)" doing
    until [ "$doing" == "no" ]
    do
        echo -e "欢迎光临!\n1:衣服¥500\n2:裤子¥400\n3:鞋子¥300\n4:帽子¥200\n5:袜子¥100\n6:放弃购买"
        read -p "请选择需要购买的商品序号:" num
        case $num in
        1)
            echo "衣服购买成功"
            let sum+=500
            ;;
        2)
            echo "裤子购买成功"
            let sum+=400
            ;;
        3)
            echo "鞋子购买成功"
            let sum+=300
            ;;
        4)
            echo "帽子购买成功"
            let sum+=200
            ;;
        5)
            echo "袜子购买成功"
            let sum+=100
            ;;
        6)
            echo "放弃购买"
            ;;
        *)
            echo "输入错误"
        esac
        read -p "是否继续在这家店购物?(yes/no)" doing
    done

    read -p "是否继续逛下一家店?(yes/no)" going
    if [ "$going" == "yes" ];then
        let n++
    else
        break
    fi
done

echo -e "一共逛了${n}家店,\n合计总消费为${sum}元"

通过脚本输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件

#!/bin/bash
#通过脚本输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件

length=$(echo $PATH | awk -F: '{print NF}')
path=$PATH


for ((i=1; i<=length; i++))
do
   folder=${path%%:*}
   path=${path#*:}
   
   find $folder -type d
   files=$(find $folder -type f)

   for j in $files
   do
       if [ ! -x $j ];then
           echo "$j 为不执行文件"
       fi
   done

done



等腰三角 图形拼接的方式

#!/bin/bash
#等腰三角 图形拼接的方式


#控制三角形的行数
for ((a=1; a<=9; a++))
do
    #输出空格倒三角
    for ((i=9; i>a; i--))
    do
        echo -n " "
    done
    #输出正直角三角
    for ((b=1; b<=a; b++))
    do
        echo -n "*"
    done
    #输出小一号的正直角三角,第一行不输出*
    for ((c=1; c<a; c++))
    do
        echo -n "*"
    done
    #每行换行
    echo ""
done

相关推荐

  1. Shell编程自动化if、for、while和函数

    2024-05-13 08:56:05       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-13 08:56:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-13 08:56:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-13 08:56:05       82 阅读
  4. Python语言-面向对象

    2024-05-13 08:56:05       91 阅读

热门阅读

  1. 批处理wordpress文件权限

    2024-05-13 08:56:05       27 阅读
  2. Springboot整合向量数据库Milvus

    2024-05-13 08:56:05       30 阅读
  3. spring中常用注解

    2024-05-13 08:56:05       30 阅读
  4. Android WebSocket 使用指南:详细步骤与实践

    2024-05-13 08:56:05       32 阅读
  5. web3.js的使用

    2024-05-13 08:56:05       35 阅读
  6. 历史文件清理

    2024-05-13 08:56:05       30 阅读
  7. 记一次requests.get()返回数据乱码问题

    2024-05-13 08:56:05       32 阅读
  8. Sass详解

    2024-05-13 08:56:05       35 阅读
  9. 如何加密Oracle后台存储过程

    2024-05-13 08:56:05       30 阅读
  10. Windows环境docker安装MySQL挂载配置不生效问题处理

    2024-05-13 08:56:05       30 阅读