前言
在shell中使用函数可以将提前写好的内容随时调用,数组则可以存放多个值,使用时可选择输出某一个值或整体
一、函数
1、创建函数
在shell脚本中添加函数格式如下
function 函数名 {
操作或命令
}或
函数名 () {
操作或命令
}
例
[root@pc1 ~]# vi sh
#!/bin/bash
a ( ) {
echo 运行成功
}
b=1
while [ $b -le 3 ]
do
a
b=$[$b+1]
done
echo 再运行一次
a
echo 结束[root@pc1 ~]# sh sh
运行成功
运行成功
运行成功
再运行一次
运行成功
结束
2、使用位置参数
计算工资
[root@pc1 ~]# vi sh
#!/bin/bash
b () {
dixin=6000
for a in $1
do
gongzi=`expr $dixin + 100 \* $2`
echo $a工资为:$gongzi
done
}
echo 工资结果如下
c=$(b 张三 2)
echo $c
e=$(b 李四 4)
echo $e
f=$(b 王五 2)
echo $f[root@pc1 ~]# sh sh
工资结果如下
张三工资为:6200
李四工资为:6400
王五工资为:6200
3、乘法运算
[root@pc1 ~]# vi sh
#!/bin/bash
a () {
echo $[ $1 * $2 ]
}
if [ $# -eq 2 ]
then b=$(a $1 $2)
echo "结果为:$b"
else echo "格式应为: sh $0 $1 $2"
fi[root@pc1 ~]# sh sh 10 20
结果为:200[root@pc1 ~]# sh sh 10 20 30
格式应为: sh sh 10 20
4、作用范围
local是用来将变量指定为局部变量,不在全局脚本中生效
[root@pc1 ~]# vi sh
#!/bin/bash
a () {
local b=10
echo "$b"
}
b=20
echo "$b"
a[root@pc1 ~]# sh sh
20
10
5、计算阶乘
[root@pc1 ~]# vi sh
#!/bin/bash
a () {
if [ $1 = 1 ]
then echo 1
else
local b=$[ $1 - 1 ]
local c=$(a $b)
echo $[ $c * $1 ]
fi
}
echo 例:计算阶乘5的结果为5!=5x4x3x2x1=120
read -p "输入要计算阶乘的数值:" e
c=$(a $e)
echo 计算的结果为:"$c"[root@pc1 ~]# sh sh
例:计算阶乘5的结果为5!=5x4x3x2x1=120
输入要计算阶乘的数值:5
计算的结果为:120
6、筛选目录和文件
筛选出某目录及子目录下包含目录及文件
[root@pc1 ~]# vi sh
#!/bin/bash
a () {
for b in `ls $1`
do
if [ -d "$1/$b" ]
then echo 子目录:"$b"
a "$1/$b"
else
echo 文件:"$b"
fi
done
}
echo "$1"目录及子目录下包含有:
a "$1"[root@pc1 ~]# sh sh 目录
二、数组
1、表示方法
a=(1 2 3 4 5)
或
a=([1]=10 [2]=30 [3]=30)
或
b="1 2 3 4 5"
a=($b)
或
a[1]=10
a[2]=20
a[3]=30
或
read -a a
1 2 3 4 5
2、使用方法
显示数组值
echo ${a[*]}
或
echo ${a[@]}
显示数组长度
echo ${#a[*]}
或
echo ${#a[@]}
显示某位数组的值(第一个数组为0位)
echo ${a[位数]}
显示范围数组的值(第一个数组为0位)
echo ${a[@]:起始位数:结束位数}
数组替换(echo只是将输出内容修改并不是真正修改了数组的值,第一个数组为0位)
echo ${a[@]/第几个数组/替换内容}
或
a[第几个数组]=替换内容
数组删除(第一个数组为0位)
unset a[要删除数组的位数]
3、使用数组的某个值
[root@pc1 ~]# vi sh
#!/bin/bash
a () {
echo 参数为:"$@"
b=$1
echo 输出为:"${b[*]}"
}
c=(1 2 3 4 5)
echo 初始为:"${c[*]}"
a $c[root@pc1 ~]# sh sh
初始为:1 2 3 4 5
参数为:1
输出为:1
4、使用整个数组
[root@pc1 ~]# vi sh
#!/bin/bash
a () {
b=("$@")
echo 输出为:"${b[*]}"
}
c=(1 2 3 4 5)
echo 初始为:"${c[*]}"
a "${c[*]}"[root@pc1 ~]# sh sh
初始为:1 2 3 4 5
输出为:1 2 3 4 5
5、冒泡排序
从小到大排序(从大到小排序将-gt改为-lt)
[root@pc1 ~]# vi sh
#!/bin/bash
read -p "输入数组:" b
a=($b)
for i in `seq 0 ${#a[@]}`
do
for((j=i+1;j<${#a[@]};j++))
do
if [[ ${a[${i}]} -gt ${a[${j}]} ]]
then c=${a[${i}]}
a[${i}]=${a[${j}]}
a[${j}]=${c}
fi
done
done
echo 从小到大排序
echo 排序后为:${a[@]}[root@pc1 ~]# sh sh
输入数组:3 2 1
排序后为:1 2 3或
[root@pc1 ~]# vi sh
#!/bin/bash
read -p "输入数组:" b
a=($b)
for ((c=1;c<${#a[*]};c++))
do
for ((d=0;d<${#a[*]}-$c;d++))
do
if [ ${a[d]} -gt ${a[$(($d+1))]} ]
then e=${a[d]}
a[d]=${a[(($d+1))]}
a[(($d+1))]=$e
fi
done
done
echo 从小到大排序
echo 排序后为:${a[*]}[root@pc1 ~]# sh sh
输入数组:3 2 1
排序后为:1 2 3
结语
数组是多个数值的集合,其中的每一个数值都称为元素,函数在定义时不能指明参数,但是在调用时可以传递参数
版权声明:本文为博主「1风天云月」的原创文章,版权归原作者所有。
阿里云链接:https://developer.aliyun.com/article/871962
CSDN链接:https://blog.csdn.net/le616616/article/details/123077125