三、shell编程之循环语句与函数

三、shell编程之循环语句与函数

一、循环语句

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 ~]# 

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

二、循环含义

常见的循环语句:for、while、until

image-20211021091358259

1.for循环语句

#基本格式:
for 名称 [in 范围] 
do 
命令
done
99乘法表
#一个简单的加法运算,计算1到10内所有整数的和
#!/bin/bash
sum=0
for i in {1..10}
do
sum=$[sum+i]
done
echo "{1..10}求和结果为$sum"


#写出一个99乘法表,正序的
#!/bin/bash
for j in {1..9}
do
for i in `seq $j`
do
echo -e "${i}*${j}=$[i*j] \t\c"
done
echo
done

#这是倒序的
#!/bin/bash
for j in {9..1..-1}#两者的差别在这
do
for i in `seq $j`
do
echo -e "${i}*${j}=$[i*j] \t\c"
done
echo
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"
批量添加用户并设置默认密码
#!/bin/bash
for i in {1..10}
do
useradd user$i
echo "123456" |passwd -- stdin user$i &>/dev/null
done

cat /etc/passwd

批量更改后缀名
#!/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
100以内求和
#使用while循环做一个加法运算
#!/bin/bash
i=0
sum=0
while [ $i -le 100 ]
do
sum=$[i+sum]
let i++
done
echo "100以内整数相加的和为$sum"

猜价格
#使用while循环做一共猜价格的游戏
#!/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

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"

三、shell函数

在数学中,函数有tan、sin、cos

但是在shell中 ,函数与别名类似

1.格式

函数名 (){
命令序列
}

直接写函数中调用函数,直接写函数名

同名函数,后一个生效

调用函数一定要先定义

只要先定义,函数定义顺序无关

2.查看函数

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

3.删除函数

unset func_name

4.函数的返回值

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"

5.函数变量的作用范围

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

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

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

四、shell数组

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[*]}


总结

熟悉条件语句的使用方法和格式

熟悉函数的定义和调用

数组的识别

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值