shell编程之循环语句与函数

一.循环语句

1.echo命令

-n 不要追加换行
-e 启用下列反斜杠转义的解释
-E 显式地抑制对于反斜杠转义的解释
后面什么都不加 强制换行

反斜杠字符作用
\n输出换行
\r光标移至行首,并且不换行
\s当前shell的名称,如bash
\t插入Tab键
\f换行,但光标仍停留在原处
\表示插入“\”本身
\b表示退格不显示前一个字符
\c抑制更多的输出或不换行
[root@localhost ~]# echo -e "23432\b432"
2343432                                                 \b数量不能大于后面字符或者数字的数量
[root@localhost ~]# echo -e "12345\c"
12345[root@localhost ~]# 

2.date命令

date查看当前系统时间
-d你描述的日期,显示指定字符串所描述的时间,而非当前时间
%F完整日期格式,等价于%Y-%m-%d
%T时间(24小时制)(hh:mm:ss)

[root@localhost ~]# date +%F
2021-10-21
[root@localhost ~]# date +%F" "%R
2021-10-21 13:52

查看前三天和后三天时间
[root@localhost ~]# date -d "-3days"
Mon Oct 18 13:56:17 CST 2021
[root@localhost ~]# date -d "+3days"
Sun Oct 24 13:56:24 CST 2021

月历 年历不加月份
[root@localhost ~]# cal 10 2021
    October 2021    
Su Mo Tu We Th Fr Sa
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

二.循环含义

将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件
重复运行次数
●循环次数事先已知
●循环次数事先未知

1.for循环

格式

for 名称 [in 范围]
do
命令
done

100求和

#!/bin/bash
sum=0
for i in `seq 100`
#for i (i=0;i<=100;i++)
do
sum=$[sum+i]
done
echo "总和是:$sum"

奇偶求和

#!/bin/bash
sum=0
for i in {2..100..2}
do
sum=$[sum+i]
done
echo "偶数总和是:$sum"
#!/bin/bash
sum=0
for i in {1..100..2}
do
sum=$[sum+i]
done
echo "奇数总和是:$sum"


批量添加用户并设置默认密码为“123456”

#!/bin/bash
for i in {1..10}
do
useradd user$i
echo "123456" |passwd -- stdin user$i &>/dev/null
done

cat /etc/passwd

99乘法表

for j in {1..9}
do
for i in `seq $j`
do
echo -ne "$j*$i=$[j*i] \t"
done
echo
done

批量更改后缀名

#!/bin/bash
cd /data

for i in *
do
name=`echo $i |cut -d "." -f1`
mv $i ${name}.bak
done

2.while

相对于for,需要知道循环次数
我们只知道停止条件,不知道次数,就需要使用while直到达到条件
while 当条件为假停止
while 格式

while 条件
do
命令
done

数字炸弹


#!/bin/bash
price=`echo $[RANDOM%1000+1]`
time=0
while true
do
read -p "请输入商品价格(1-1000):" num
let time++
if [ $price -eq $num ]
then
echo "恭喜你猜对了"
echo "$time 次"
exit 1
elif [ $price -lt $num ]
then
echo "您猜的价格高了"
else
echo "您猜的价格低了"
fi
done

用while求和

#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
sum=$[sum+i]
let i++
done
echo "和为:$sum"

3.until

until 当条件为真停止
格式

until 条件
do
命令
done

until做100求和

#!/bin/bash
sum=0
i=0
until [ $i -gt 100 ]
do
sum=$[sum+i]
let i++
done
echo "求和结果为$sum"

三.函数

1.菜单

格式

PS3="菜单目录;"
menu="
选项1
选项2
.....
"
select menu in $menu
do
case $REPLY in
1)
脚本/命令
;;
2....
;;
*)
命令

2.函数

1.格式

函数名 (){
命令序列
}

直接写函数中调用函数,直接写函数名
同名函数,后一个生效
调用函数一定要先定义
只要先定义,函数定义顺序无关

2.查看函数

[root@localhost ~]# declare -F
declare -f __HOSTNAME
declare -f __SIZE
declare -f __SLAVEURL

3.删除函数

unset func_name

4.函数变量的作用范围:

函数在shell脚本中仅在当前的shell环境中有效

shell脚本中的变量默认全局有效

将变量限定在函数内部使用local命令

5.函数的返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值

!/bin/bash
sum (){
echo "diyigebianliang:" $1
echo "di2gebianliang: " $2
let n=$1+$2
echo $n
}

sum $2 $1

[root@localhost ~]# . bl.sh 2 4
diyigebianliang: 4
di2gebianliang: 2
6

分析:由于输入顺序为2 和4,那么赋予了脚本里 sum $2 he$1 为2和4 ,然后再回到函数里,一一对应

数的阶乘

#!/bin/bash
sum=1
read -p "请输入一个大于0的整数:" num
for i in `seq $num`
do
sum=$[i*sum]
done
echo "$num的阶乘为:$sum"

四.数组

1.定义数组格式:

  1. 数组名=(value0 value1 value2 value3 …)

  2. 数组名=([0]=value [1]=value1 [2]=value2 …)

  3. 列表名="value0 value1 value2 value3 … "

    数组名=($列表名)

  4. 数组名[0]=“value1”

    数组名[1]=“value2”

    数组名[2]=“value3”

2.数组的包括数据类型

  • 数值型
  • 字符型
  • 混合型(数字加字符)

使用" "或’ '定义单引号或双引号括起来

[root@localhost ~]# a=(2 5 6 3 1)
[root@localhost ~]# echo ${a[*]}                                显示所有项
2 5 6 3 1
[root@localhost ~]# echo ${a[@]}
2 5 6 3 1
[root@localhost ~]# echo ${#a[@]}                               统计个数
5
[root@localhost ~]# echo ${#a[*]}
5
[root@localhost ~]# a[4]=7                                    用7替换下标为4的项
[root@localhost ~]# echo ${a[*]}
2 5 6 3 7
[root@localhost ~]# echo ${!a[*]}                             显示下标
0 1 2 3 4
[root@localhost ~]# echo ${a[*]:1:2}                          下标1开始,长度为2
5 6
[root@localhost ~]# echo ${a[*]::1}                           下标1之前的数字
2

[root@localhost ~]# b=(apple banana orange)
[root@localhost ~]# echo ${b[*]:1:2}
banana orange
[root@localhost ~]# echo ${b[*]/apple/bule}                   替换
bule banana orange

3.uset 数组是删除数组

冒泡

#!/bin/bash
a=(23 87 45 93 56)
for ((j=1;j<${#a[@]};j++))
do
for ((i=0;i<${#a[@]}-j;i++))
do
if [ ${a[$i]} -gt ${a[$i+1]} ]
then
tmp=${a[$i+1]}
a[$i+1]=${a[$i]}
a[$i]=$tmp
fi
done
done

echo ${a[*]}

总结

条件语句的使用方法和格式
函数的定义和调用
数组的识别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值