shell编程echo语句、运算方法、循环语句与函数

一 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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/cenjeal/article/details/108074560