shell 循环语句for 和echo命令的补充


文章目录

  • shell 循环语句for 和echo命令的补充
  • echo命令补充
  • echo中{}的用法
  • 循环语句(for )
  • for语句的结构
  • 例子
  • 例一
  • 例二
  • 例三
  • 例四
  • 例五


echo命令补充

echo -n #表示不换行输出

echo -e #输出转义字符,将转义之后的内容输出到屏幕上

常用的转义字符(必须跟上-e选项且需要加上“”)

\b #转移之后相当于退格键(backspace),前提是“\b”后边存在字符;
   #“\b”表示删除前一个字符“\b\b”表示删除两个字符
\c #不换行输出
\n #换行,被输出的字符从“\n”处开始另起一行,也可当作回车操作
\f #换行,但是换行后的新航的开头位置衔接着上一行的行尾
\v #与\f相同
\t #转以后表示插入tab,即横向制表符
\r ##光标移至行首,但是不换行,相当于使用\r以后的字符覆盖\r之前的字符;
   ##但是当\r后不存在任何字符时,\r之前的字符不会被覆盖;可模拟回车功能
\\ #表示插入“\”本身

echo中{}的用法

从尾部匹配字符到第一个字符位置

i=`echo "11,22,33,44"`
echo ${i%,*}
11,22,33
#从最后倒数到最短的匹配部分(用%)后面的逗号的地方被删除
#即匹配到44之前的",",然后将44删除
#即输出变量值内容,除了最后一个字段

从尾部匹配字符到第最后一个字符位置

i=`echo "11,22,33,44"`
echo ${i%%,*}
11
#从最后倒数到最长的匹配部分(用%%)后面的逗号的地方被删除
#即匹配到11后的逗号,11后都删除
#即输出变量值内容的第一个字段

从头部匹配字符到第一个字符位置

i=`echo "11,22,33,44"`
echo ${i#*,}
22,33,44
#从最后倒数到最长的匹配部分(用#)后面的逗号的地方被删除
#即匹配到11后的逗号,","前都删除
#即输出变量值的内容,除了第一个字段

从头部匹配字符到最后一个字符位置

i=`echo "11,22,33,44"`
echo ${i##*,}
44
#从开头到最长的匹配部分(用##)后面的逗号的地方被删除
#即匹配到11后的逗号,44前都删除
#即输出变量值的内容的最后一个字段
echo ${b: -abc}
#调用默认值
echo ${b: =abc}
#调用默认值并赋值

循环语句(for )

for语句的结构

读取不同的变量值,来诸葛执行同一组命令

for 变量名 in 取值列表
do
  命令序列
done

#遍历取值列表里的值全都执行一遍

例:

for 收件人 in 邮件地址列表
do
  发送邮件
done

取值列表的表达方式(范围)

{1..6}  ##用{}表示
123456  ##直接打出要进行循环的数
$(seq 1 6) ##用seq止步于哪一位

例子

例一

计算出1~100所有整数的和,并分出其中所有奇数和和偶数和

#!/bin/bash
for i in {1..100}
do
  sum=$[$sum+$i]
  if [ $[ $i % 2 ] -eq 1 ]
    then
      sum1=$[$sum1 + $i]
  else
      sum2=$[$sum2 +$i]
  fi
done
echo " 1~100所有数的和为:$sum"
echo " 1~100所有数的奇数和为:$sum1"
echo " 1~100所有数的偶数和为:$sum2"

echo追加一行 echo追加不换行_linux


echo追加一行 echo追加不换行_echo追加一行_02

例二

检测指定范围主机是否通信,并将能够通信的主机ip输出到host_ip文件中

#!/bin/bash

for ip in 172.16.100.{1..254}
do
{
  if [ $ip = "172.16.100.1" ]
    then
      ping-c 3 -i 0.5 -w 2 $ip &> /dev/null
    if [ $? -eq 0 ]
      then
        echo "$ip is online" > /opt/host_ip
    fi
  else
    ping -c 3 -i 0.5 -w 2 $ip &> /dev/null
    if [ $? -eq 0 ]
      then
        echo "$ip is online" >> /opt/host_ip
    fi
  fi
}&
done
wait
echo "在线的主机如下:`cat /opt/host_ip`"

echo追加一行 echo追加不换行_循环语句_03

例三

用户输入密码,脚本判断密码是否正确,输入正确提示正确信息,连续输错3次则报警

#!/bin/bash
for i in {1..3}
  do
    read -p "请输入密码" num
    if [ $num = 123456 ]
      then
        echo "密码正确"
      exit
    else
      echo "请重新输入"
    fi

  done
echo "结束"

echo追加一行 echo追加不换行_bash_04

例四

编写能够自动生成一个8位随机密码的脚本

#i/bin/bash
str="qwertyuiopasdfghjklzxcvbnm123456789QAZWSXEDCRFVTGBYHNUJMIKOLP"
for i in {1..8}
  do
    num=$[$RANDOM % ${#str}]
    tmp=${str:num:1}
    password+=$tmp
  done
echo "随机密码:$password"

echo追加一行 echo追加不换行_循环语句_05

例五

将一个0到255之间的十进制数转换成二进制数

#!/bin/bash
read -p "输入一个数(0~255)" num

if [ $num -ge 0 ] && [ $num -le 255 ]
  then
    for ((i=1; i<=8; i++))
    #由于十进制数在0到255之间所以,二进制最多为8位,循环八次
      do
        num1="$[ $num %2 ]  $num1" 
        #将$num取余数并赋予$num1, 后面跟一个$num1表示$num1之前的反向输出
        num=$[ $num /2 ]
        #$num按循环次数除2取商
      done
  echo "$1 转二进制为: $num1"
else
  echo "错误重新输入"
fi

echo追加一行 echo追加不换行_循环语句_06


echo追加一行 echo追加不换行_linux_07