循环语句
for循环语句
for语句结构
读取不同的变量值,用来逐个执行同一组命令
语句结构
for 变量名 in 取值列表
do
命令序列
done

例如
批量添加用户
用户名存放在users.txt文件中,每行一个
初始密码均设为123456
[root@localhost opt]# vim user.txt
zhangsan
lisi
wangermazi
zhaoliu
tianji
wangba
vim user.txt
#!/bin/bash
list=$(cat /opt/user.txt)
for v in $list
do
useradd $v
echo "123456" | passwd --stdin $v
echo "创建用户${v}成功"
done
根据IP地址检查主机状态
检测IP地址192.168.197.0-192.168.197.10段落
使用ping命令检测各主机的连通性
[root@localhost opt]# vim ip.sh
#!/bin/bash
for ((i=1;i<=10;i++))
do
ping -c 3 -i 0.2 -W 3 "192.168.197.$i" &> /dev/null
if [ $? -eq 0 ]
then
echo "Host 192.168.197.$i is up"
else
echo "Host 192.168.197.$i is down"
fi
done
shell中let命令
let 对整数进行数学运算
let和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。
语法格式
let 表达式
或
let "表达式"
或
let '表达式'
以上方式都等价于 ((表达式))
#!/bin/bash
for ((i=1;i<=10;i++));do
echo $i
done
#!/bin/bash
for ((i=1;i<=100;i+=2));do
let sum+=$i
done
echo "$sum"
while循环语句
while语句结构
重复测试某个条件,只要条件成立则反复执行
语句结构
while 条件测试操作
do
命令序列
done

#!/bin/bash
i=1
while [ $i -le 100 ]
do
if [ ! `expr $i % 3` -eq 0 ];then
echo $i
fi
let i++
done
九九乘法表
#!/bin/bash
for ((i=1;i<=9;i++))
do
for ((j=1;j<=i;j++))
do
sum=$[$i*$j]
echo -n "$i*$j=$sum "
done
echo
done
等腰三角形
#!/bin/bash
for ((i=1;i<=5;i++))
do
for ((k=5;k>=i;k--))
do
echo -n " "
done
for ((j=1;j<=2*i-1;j++))
do
echo -n "*"
done
echo ""
done
until语句结构
重复测试某个条件,只要条件不成立则反复执行
until 条件测试操作
do
命令序列
done

为指定用户发送在线消息
若用户不在线(未登录系统),则每5s试一次,直至用户登录系统后再发送信息,用户名与消息通过位置参数传递给脚本
1.位置参数个数大于
2.姓名属于系统用户 /etc/passwd
3.是否在线 until who
4.发送信息 echo “ ” | write 用户名
#!/bin/bash
username=$1
if [ $# -lt 1 ];then
echo "Usage : 'basename $0' <username> [<message>]"
exit 1
fi
if grep "$username" /etc/passwd > /dev/null;then :
else
echo “not user”
exit 2
fi
until who |grep "$username" > /dev/null;do
echo “user not login”
sleep 5
done
~
猜价格游戏
#!/bin/bash
num=$[RANDOM%101]
i=0
while true
do
let i++
read -p "请输入您猜测的价格(0-100)" a
if [ $a -eq $num ];then
echo "恭喜你猜对了"
break
elif [ $a -lt $num ];then
echo "低了"
else
echo "高了"
fi
done
echo "你一共猜了${i}次"
shell函数
将命令序列按格式写在一起
可方便重复使用命令序列
shell函数定义
[ function ] 函数名(){
命令序列
[return x] #使用return或exit可以显示的结束函数
}
return返回的是状态码,需要使用$?调取
echo 返回的是值,使用变量调用
传参:指位置变量
可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
调用函数的方法
函数名 [参数1] [参数2]
递归函数
调用自己本身的函数
递归遍历目录
#!/bin/bash
function list_files(){
for f in `ls $1`
do
#判断是否为目录
if [ -d "$1/$f" ];then
echo "$2$f"
#递归调用
list_files "$1/$f" " $2"
else
echo "$2$f"
fi
done
}
list_files "/var/log" ""
[root@localhost opt]# sh files.sh
anaconda
anaconda.log
ifcfg.log
journal.log
ks-script-E3s5jr.log
packaging.log
program.log
storage.log
syslog
X.log
audit
...
shell数组
获取元素长度
遍历元素
元素切片
元素替换
元素删除
…
注意,忌讳数组越界,
数组下标从0开始算
数组长度从1开始算
shell中数组是可变长的
数组定义方法
方法一:
基本格式
数组名=(value0 value1 value2…)
方法二:
基本格式
数组名=([0]=value [1]=value [2]=value…)
方法三:数组元素之间使用空格隔开
基本格式
列表名=“value0 value1 value2” 数组名=($列表名)
方法四:(多用于替换)
基本格式
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value” …
例
根据用户需求自定义数组
[root@localname opt]# vim ceshi.sh
#!/bin/bash
i=0
while true
do
read -p "是否存入元素(yes/no)" a
if [ $a == "no" ]
then
break
fi
read -p "请输入第$[$i+1]个元素:" b
num[$i]=$b
let i++
done
echo "${num[*]}"

把数组中小于60的数替换成60
#!/bin/bash
num=(72 62 52 42 32 22 12 75 85 95)
i=1
for v in ${num[*]}
do
if [ $v -lt 60 ]
then
new[$i]=60
else
new[$i]=${num[$i]}
fi
let i++
done
echo "${new[*]}"

数组排序(冒泡排序)
#!/bin/bash
num=(72 62 52 42 32 22 12 75 85 95)
tmp=0
for ((i=1;i<${#num[*]};i++))
do
for ((j=0;j<${#num[*]}-i;j++))
do
if [ ${num[$j]} -gt ${num[(($j+1))]} ];then
tmp=${num[$j]}
num[$j]=${num[(($j+1))]}
num[(($j+1))]=$tmp
fi
done
done
echo ${num[*]}

本文深入探讨了Shell脚本中的循环语句(for、while、until)与函数的使用方法,包括结构、实例及数组操作,适用于系统管理和自动化任务。

1772

被折叠的 条评论
为什么被折叠?



