shell编程循环语句与函数
- 一 echo语句
- 1.1 echo常用转义字符
- 1.2 运算方法
- 二 循环语句
- 2.1 for循环
- 2.1.1 for循环格式
- 2.1.2 循环中断(break、continue)
- 2.1.3 for循环三种方法
- 2.2 while循环
- 2.3 until循环
- 三 函数
- 3.1 函数返回值
- 3.2 递归函数
- 3.3 函数库的创建与调用
- 四 for循环输出九九乘法表、菱形
- 4.1 乘法表
- 4.2 菱形
一 echo语句
1.1 echo常用转义字符
echo -n表示不换行输出
echo -e输出转义字符,将转义后的内容输出到屏幕上
常用转义字符 | 释义 |
---|---|
\b | 转义后相当于按退格键(backspace) ,但前提是"\b"后面存在字符; “\b"表示删除前一个字符,”\b\b"表示删除前两个字符。 |
\c | 不换行输出,在"\c"后面不存在字符的情况下,作用相当于echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。 |
\n | 换行,被输出的字符从"\n"处开始另起一行。 |
\v或\f | 换行,但是换行后的新行的开头位置连接着上一行的行尾 |
\t | 表示插入tab,即横向制表符; |
\r | 光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符,但是当"\r"后面不存在任何字符时,"\r" 前面的字符不会被覆盖 |
\\ | 表示插入“\”本身 |
操作实例
1.2 运算方法
shell脚本中有4种运算方法
1. i=$(expr 12 \* 5)
2. i=$((12*5))
3. i=$[12*5]
4. let i= 12*5
i++相当于i=$[$i+1]
i--相当于i=$[$i-1]
i+=2相当于i=$[$i+2]
二 循环语句
2.1 for循环
使用for循环语句时,需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令序列,直到变量值用完完全退出循环。在这里,取值列表是for语句的执行条件,其中包括多个属性相同的对象,需要预先指定。
2.1.1 for循环格式
for 变量名 in 取值列表
do
命令序列
done
例:添加用户和删除用户
#!/bin/bash添加用户
ULIST=$(cat /root/user.txt)
for UNAME in $ULIST
do
useradd $UNAME
echo "123456" | passwd --stdin $UNAME &> /dev/null //把输出信息丢弃
done
#!/bin/bash删除用户
$ULIST=$(cat /root/user.txt)
for UNAME in $ULIST
do
userdel -r $UNAME
[$? -eq 0] && [echo "已删除用户$UNAME"]
done
2.1.2 循环中断(break、continue)
break默认跳出单个循环,break 2跳出两个循环,以此类推,break n跳出n个循环。
continue终止某次循环中的命令,但不会完全终止整个循环
2.1.3 for循环三种方法
方法1
[root@localhost ~]#for i in {1..10};do echo $i;done //按序输出1到10
[root@localhost ~]#for i in {1..10..2};do echo $i;done //输出1到10,步长为2
方法2
[root@localhost ~]#for i in $(seq 1 10);do echo $i;done //按序输出1到10
[root@localhost ~]#for i in $(seq 1 2 10);do echo $i;done //输出1到10,步长为2
方法3
[root@localhost ~]#for ((i=1;i<=10;i++));do echo $i;done
2.2 while循环
while 条件测试操作
do
命令序列
done
例:竞猜商品价格
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "good's price between 0-999,how much?"
while true
do
read -p "please input the price you guessed:" INT
let TIMES++
if [ $INT -eq $PRICE ];then
echo "You're right.The price is $PRICE"
echo "You have guessed $TIMES times."
exit 0
elif [ $INT -gt $PRICE ];then
echo "Too high!"
else echo "Too low!"
fi
done
2.3 until循环
重复测试某个条件,只要条件不成立就反复执行
until 条件测试操作
do
命令序列
done
例:从1开始累加
#!/bin/bash
read -p "从1加到几?" num
i=0;s=0
until [ $i -eq $num ]
do
let "i++";let "s=$s+$i"
done
echo "sum(1...$num)="$s
三 函数
函数定义
[function] 函数名 ()
{
命令序列
[return x]
}
调用函数
函数名 [参数1] [参数2]
3.1 函数返回值
return表示退出函数并返回一个退出值,脚本中可以用 ? 变 量 显 示 该 值 使 用 原 则 : 1 函 数 一 结 束 就 取 返 回 值 , 因 为 ?变量显示该值 使用原则: 1 函数一结束就取返回值,因为 ?变量显示该值使用原则:1函数一结束就取返回值,因为?变量只返回执行的最后一条命令的退出状态码
2 退出状态码必须是0-255,超出时将除以256取余
db()
{
read -p "input:" value
return $[$value * 2]
}
db
echo $?
3.2 递归函数
递归函数调用自己本身,在分析函数时可以先跳过函数调用,再对该部分进行分析。
例:递归遍历环境变量中的目录和可执行文件
#!/bin/bash
//递归函数部分
file_list() {
for f in $1/* // $1/*表示取值列表,读取PATH下目录
do
if [ -d $f ];then //对$f进行判断,-d表示是否为目录
echo "$2$f"
file_list "$f" " $2" //调用函数自身,把$f下的所有目录和文件作为取值列表,再次进行判断
elif [ -x $f ];then //对$f进行判断,-x表示是否为可执行文件
echo "$2$f" //输出空格接该文件
fi
done
}
//主程序部分
IFS=$IFS':' //IFS字段分隔符,默认包含空格,换行,制表符,加入':'对冒号也可以识别并进行分隔
for folder in $PATH
do
echo "$folder:"
file_list "$folder" " " //调用函数,加入位参1,2
done
3.3 函数库的创建与调用
例:加减乘除函数库
创建函数库
[root@localhost ~]#vim myfuncs.sh
jiafa()
{
echo $[$1+$2]
}
jianfa()
{
echo $[$1-$2]
}
chengfa()
{
echo $[$1*$2]
}
chufa()
{
if [ $2 -ne 0 ];then
echo $[$1/$2]
else
echo '$2不能为0'
fi
}
//调用函数库
. myfuncs.sh
value1=10
value2=5
result1=`jiafa $value1 $value2`
result2=`jianfa $value1 $value2`
result3=`chengfa $value1 $value2`
result4=`chufa $value1 $value2`
echo "加法结果为$result1"
echo "减法结果为$result2"
echo "乘法结果为$result3"
echo "除法结果为$result4"
四 for循环输出九九乘法表、菱形
4.1 乘法表
#!/bin/bash
for ((i=1;i<=9;i++)) //外循环控制行数
do
for ((j=1;j<=i;j++)) //内循环控制列数
do
echo -n -e "$i x $j = $((i * j))\t"
done
echo -e "\n"
done
4.2 菱形
#!/bin/bash
#菱形上半部分
for ((i=9;i>=1;i--)) #控制行数
do
for ((a=1;a<=$i;a++)) #控制第i行第一段输出
do
echo -n " "
done
for ((b=9;b>=$i;b--)) #控制第i行第二段输出
do
echo -n "*"
done
for ((c=8;c>=$i;c--)) #控制第i行第三段输出
do
echo -n "*"
done
echo ""
done
#菱形下半部分
for ((h=2;h<=9;h++))
do
for ((d=1;d<=$h;d++))
do
echo -n " "
done
for ((e=9;e>=$h;e--))
do
echo -n "*"
done
for ((f=8;f>=$h;f--))
do
echo -n "*"
done
echo ""
done