shell循环语句
Posted 段小宝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell循环语句相关的知识,希望对你有一定的参考价值。
双撇号与 $() 里面可以是可执行命令
$[] 和 $(()) 里面可以使算数表达式
文章目录
一、echo 操作
1.1 echo 命令属性
echo 输出默认自带换行符
常用参数:
-n:不要在最后自动换行;
-e:若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出(允许解释加反斜线的转义字符):
- \\a 发出警告声;
- \\b 删除前一个字符,相当于退格(backspace)键,前提是 \\b 后存在字符;
- \\c 不换行输出,最后不加上换行符号,相当于 echo -n;
- \\f 换行但光标仍旧停留在原来的位置;
- \\n 换行且光标移至行首;
- \\r 光标移至行首,但不换行,相当于使用"\\r"以后的字符覆盖"\\r"之前同等长度的字符;但是当"’\\r"后面不存在任何字符时," \\r"前面的字符不会被覆盖
- \\t 插入tab;
- \\v 与 \\f 相同;
\\\\
表示插入\\
字符本身;
\\b 、\\r 等转义符的数量 尽量和 字符数量一致
例:通过一条 echo 语句完成磁盘的格式化。
echo -e "n\\np\\n\\n\\n\\nw\\n" | fdisk /dev/sdb
n新建 回车 p主分区 回车 分区号回车 起始回车 大小回车 w保存回车
1.2 结合echo实现其他功能
功能一:字符串截取1
//从最后倒数到最短的匹配部分(用%)后面的逗号的地方被删除
i=`echo "11,22,33,44"`
echo ${i%,*}
11,22,33
//从最后倒数到最长的匹配部分(用%%)后面的逗号的地方都被删除
echo $ { i%%,* }
11
//从开头到最短的匹配部分(用)后面的逗号的地方被删除
echo $ { i#*,}
22,33,44
//从开头到最长的匹配部分(用##)后面的逗号的地方被删除
echo $ { i##*,}
44
功能二:字符串截取2
下标从0开始
功能三:获取变量长度
二、for 循环
2.1 单层 for
for 语句用来 遍历 集合或列表。
shell 中有两种用法:
for i in $(seq 1 5);
for ((i=1;i<=5;i+=2));
操作:
●批量添加未存在的用户
◆用户名存放在users.txt文件中,每行一个初始密码均设为123456
新增 users.txt 文件,vim users.txt 录入用户
vim adduser.sh
chmod +x adduser.sh
#!/bin/bash
USERS=`cat ~/adduser.txt`
echo "文件中的用户有:" $USERS
for u in $USERS
do
if [ `cat /etc/passwd | grep $u` ];then
echo $u "用户已存在"
echo ""
else
echo "开始新增用户 $u":
echo ""
useradd $u &> /dev/null
echo "123456" | passwd --stdin $u &> /dev/null
fi
done
实验结果
2.2 多层 for
正三角递增
read -p "输入三角形长度:" len
for ((a=1;a<=len;a++))
do
for (( b=$len;b>a;b--)) #空格
do
echo -n " "
done
for c in `seq 1 $a` #left
do
echo -n "$a"
done
for d in `seq 2 $a` #righr
do
echo -n "$a"
done
echo ""
done
三、while 循环
重复测试某个条件,只要条件成立则反复执行
操作:
◆通过变量RANDOM获得1-999随机数
◆提示用户猜测并记录次数,猜中后退出循环
#!/bin/bash
num=$[$RANDOM%1000]
sum=0
a=1
while [ $a -lt 2 ]
do
read -p "请输入一个数:" in
if [ $in -lt $num ];then
echo "小了"
let sum++
elif [ $in -gt $num ];then
echo "大了"
let sum++
else
echo "666,对了"
let sum++
#let a=3
break;
fi
done
echo "猜了$sum次"
四、 untli 循环
重复测试某个条件,只要条件不成立则反复执行,直到条件为止。
和 while 是完全相反的:
- while是表达式正确才执行循环体,错误结束循环;
- until 是表达式错误才会执行循环体,正确结束循环。
#!/bin/bash
a=1
until [ $a -gt 5 ] #当a大于5时,结束循环
do
echo $a
let a++
done
break
break 退出单个循环,break 2 退出2层循环
#!/bin/bash
for ((i=1;i<=3;i++))
do
echo "i---- $i"
for ((j=1;j<=5;j++))
do
echo "j--------------$j"
if [ $j -eq 2 ];then
break; #退出整个循环
#break2; #退出两层循环
fi
done
done
continue
终止当前循环的命令,去执行下一次循环,不会中止整个命令
for ((i=1;i<=3;i++))
do
echo "i---- $i"
for ((j=1;j<=3;j++))
do
if [ $j -eq 2 ];then
continue;
fi
echo "j--------------$j"
done
done
exit
exit 退出整个shell 脚本,后面的语句都不执行
exit 、 exit 0 正常退出,$? 获取为0
exit 1、2 … 异常退出, $? 获取为非0,1 、2 …
for ((i=1;i<=3;i++))
do
echo "i---- $i"
exit
done
echo "qeqeq"
五、 seq 用法
类似功能:
六、RANDOW 随机数
shell带有内置函数RANDOM可以随机生成随机数其范围为:0~32767
比如想获取 1-999 之间的随机数,则%1000即可。
七、set 本地变量
[root@linux ~]# aaa=bbb #设置本地变量
[root@linux ~]# echo $aaa #显示变量的值
bbb
[root@linux ~]# set|grep aaa #查看本地变量
aaa=bbb
以 IFS 为例
默认的是 支持 空格 退格 换行。
实验:修改 IFS,让其只支持 换行识别
没加 IFS=$'\\n'
之前
加了之后
#!/bin/bash
s=0
IFS_OLD=$IFS
IFS=$'\\n'
for i in `cat /root/myShell/userss.txt`
do
echo $i
let s++
done
echo $s
#IFS=$IFS_OLD
八、read line
使用 read line 可以按行读取文件
例:从文件中按行读取文件/root/myShell/userss.txt中的内容输出到屏幕中 :
方法一:
while read line
do
echo $line
done < /root/myShell/userss.txt
方法二:
#!/bin/bash
cat /root/myShell/userss.txt | while read line
do
echo $line
done
以上是关于shell循环语句的主要内容,如果未能解决你的问题,请参考以下文章