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" 前面的字符不会被覆盖

\\

表示插入“\”本身

操作实例

linux shell echo 位置 shell中echo_linux

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循环格式

linux shell echo 位置 shell中echo_linux_02

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循环

linux shell echo 位置 shell中echo_for循环_03

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循环

重复测试某个条件,只要条件不成立就反复执行

linux shell echo 位置 shell中echo_linux shell echo 位置_04

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表示退出函数并返回一个退出值,脚本中可以用linux shell echo 位置 shell中echo_linux_05?变量只返回执行的最后一条命令的退出状态码
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

linux shell echo 位置 shell中echo_for循环_06

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

linux shell echo 位置 shell中echo_bash_07