文章目录
三、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
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[*]}
总结
熟悉条件语句的使用方法和格式
熟悉函数的定义和调用
数组的识别