shell 编程之循环语句echo用法

黄沙百战穿金甲,不破楼兰终不还。这篇文章主要讲述shell 编程之循环语句echo用法相关的知识,希望能为你提供帮助。
循环语句for语句结构

读取不同的变量值,用来逐个执行同一组命令
格式:
for 变量名 in 取值列表
do
命令序列
done

语法逻辑;
案例1:
批量添加用户
用户名存放在users.txt文件中, 每行一个
初始mima均设为123456
验证脚本

脚本:
#!/bin/bash
users=$(cat /etc/passwd | awk -F: print $1)

for name in $(cat ~/user.txt)
do
echo $users | grep $name & > /dev/null
if [ $? -eq 0 ]
then
echo "$name 已存在"
else
echo "正在创建 $name 用户并设置mima"
useradd $name
echo 123456 | passwd --stdin $name & > /dev/null
fi
done



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

脚本:
#shell实现多线程
#!/bin/bash
for ip in 192.168.80.1..254
do

ping -c 3 -i 0.5 -w 2 $IP & > /dev/null
if [ $? -eq 0 ]; then
echo "$IP online" > > /opt/hostlist.txt
else
echo "$IP off" > > /opt/hostlist.txt
fi
&
done
wait
cat /opt/hostlist.txt

#在命令后而增加了& 标记,意思是将进程扔到后台。
在shell中,后台命令之间是不区分先来后到关系的。
#wait会等待到所有的后台程序执行完毕再执行后而的shell语句。
如果没有wait,后而的shel1语句是不会等待后台进程的,一些对前面后台进程有依赖
关系的命令执行就不正确了。



while 语句结构
解释:重复测试某个条件,只要条件成立则反复执行
格式:
while条件测试操作
do
命令序列
done
示例:
#!/bin/bash
a=1
while[$a -ge 1 -a $a -le 10
do
echo $a
let a++
done



逻辑列表:
案例1:
批量添加用户
用户名称以stu开头,按数字顺序进行编号
一共添加20个用户,即stu1、 stu2、 ..... stu20
初始mima均设为123456

脚本:
#!/bin/bash
name=1
while [ $name -ge 0 -a $name -le 20 ]
do
useradd stu$name
echo 123456 | passwd --stdin stu$name
let name++
done



案例2:guess.sh
猜商品价格游戏
通过变量RANDOM获得随机数
提示用户猜测并记录次数,猜中后退出循环

脚本:
#!/bin/bash
CURRENT=$[RANDOM % 1000]
a=1
num=0
while [ $a -eq 1 ]
do
read -p "请输入你猜测的价格(0-999):" price
if [ $price -gt $CURRENT ]; then
echo "猜高了,请重试!"
let num++
elif [ "$price" -lt "$CURRENT" ]; then
echo "猜低了,请重试!"
let num++
elif [ "$price" -eq "$CURRENT" ]; then
let num++
echo "猜对了,正确价格为$price,你猜了 $num次"
let a++
fi
done




until 语句结构
解释:复测试某个条件,只要条件不成立则反复执行
格式:
until条件测试操作
do
命令序列
done
示例:
#!/bin/bash
a=1
until[$a -gt 10]
do
echo $a
let a++
done


【shell 编程之循环语句echo用法】
案例1
●为指定用户发送在线消息
若用户不在线(未登录系统),则每10分钟试-次,直至用
户登录系统后在发送信息
用户名与消息通过位置参数传递给脚本

脚本:
#!/bin/bash
# example: ./write.sh < USERNAME> [ message ]
username=$1
msg=$2

#用于判断执行脚本的格式是否携带了位置参数
if [ $# -lt 1 ]; then
echo "USAGE: $0 < USERNAME> [message] "
exit 1
fi

#用于判断携带的用户名参数是否正确
grep "^$username:" /etc/passwd > /dev/null
if [ $? -ne 0 ]; then
echo "$username 不是系统用户!"
exit 2
fi

#用户判断系统用户是否已登录
who | grep "$username" > /dev/null
while [ $? -ne 0 ]
#until [ $? -eq 0 ]
do
echo "$username 尚未登录系统,请先登录!"
sleep 10
done

if [ -z "$msg"]; then
msg="hello $username,this is default message"
echo "执行命令:echo $msg | write $username"
else
echo "执行命令:echo $msg | write $username<

    推荐阅读