函数的基本定义:
# function define
# 1.function func_name(){
# }
# 2.function func_name {
# }
# 3.func_name() {
# }
# execute:
# func_name param1 param2 ...
# function 也是代码块:类似于在执行一条语句
# 函数体中可以有哪些东西: 变量定义,正常的命令, if, for, return
# return 类似于我们在脚本使用exit exit_code, 返回值的范围:0-255
# 执行了return 即代表函数结束了, 如何获取return返回的值
# $?: 正常去执行一条命令:bash/sh script.sh# 或者执行一个
脚本,$?取的是exit exit_code
# 函数并不是去执行一个可执行文件,即执行一个代码块
# 在函数中$?:获取的是return返回值
# 产生的问题: 如何获取函数执行的结果:
# 通过定义一个变量:var_data=func_name
# var_data接收的是什么?在函数内部使用echo/printf输出
# 输出到标准输出的内容
# 定义一个变量: 在函数内部,和在函数外部定义的变量,一样吗?一样
# 如何定义一个不一样的呢?local关键字来定义局部变量
数组的基本定义:
数组分类:
indexed array:索引数组
associative array:关联数组
索引数组: 就是数组的索引都是整数:0, 1, 2, 3
建立数组第一种方式: array=(value1 value2 value3 ...) # 使用这种方式建立数组的时候
# 有没有指定索引: array[0]=value1, array[1]=value2
建立数组的第二种方式: array=([0]=value1 [1]=value2 [2]=value3....)
# 指定了索引数组
# [root@rocky 20220828]# array=([key1]=value1)
# [root@rocky 20220828]# echo ${!array[*]}
# =>0
# 验证了一个结果: 索引数组的索引只能是整数数字
# 问题是:使用第二种方式:去建立数组的时候,我的索引必须从0开始吗?答案是:不是
# 删除数组中的一个元素: unset array[0]
建立数组的第三种方式: array[4]=11;array[5]=16
建立数组的第四种方式:array=({1..3}) array=({1,2,3}), array=(`seq 3`)
建立数组的第五种方式:
-a Each name is an indexed array variable (see Arrays
above).
每一个名字是一个索引数组变量
declare -a array1 array2 array3 .....
使用数组: 访问数组中某一个元素: array[index]
访问数组中的所有元素: array[*/@]
访问数组中的所有索引: !array[@/*]
数组的长度: ${#array[@/*]}
添加或修改: array[index]=value
删除:
删除数组: unset array
删除数组的元素: unset array[index]
去定义数组的array=([1]=2 [2]=3 [1]=4)=> 数组有几个元素: 2个=> array[1]=4, array[2]=3
关联数组: 在使用的时候: array[string]=value
declare -A associative_array
-A Each name is an associative array variable (see
Arrays above).# 每一个名字是一个关联数组变量
实验一:online写一个脚本,判定给定的IP列表中的主机哪些在线
(第一种方法直接用函数实现)
[root@localhost ~]# vim online_host1.sh
online() {
for i in {200...254}
do
if ping -c 1 192.168.0.$i &> /dev/null;then # ping -c 1 用来判断是否主机是否在线
echo "192.168.0.$i is up"
else
echo "192/168.0.$i is down"
fi
done
}
online
(第二种方法使用函数传参)
[root@localhost ~]# vim online_host1.sh
online() {
if ping -c 1 $1 &> /dev/null;then
echo "$1 is up"
else
echo "$1 is down"
fi
}
for i in {200..254}
do
online 192.168.0.$i
done
(第三种方法使用函数返回值判断)
[root@localhost ~]# vim online_host1.sh
online () {
if ping -c 1 $1 &> /dev/null;then
return 0
else
return 1
fi
}
for i in {200..254}
do
online 192.168.0.$i
if [ $? -eq 0 ];then
echo "192.168.0.$i is up"
else
echo "192.168.0.$i is down"
fi
done
实验二:函数能够接受一个参数,参数为用户名;
判断一个用户是否存在
如果存在,就返回此用户的shell和UID;并返回正常状态值;
如果不存在,就说此用户不存在;并返回错误状态值;
[root@localhost ~]# vim user_mess.sh
user() {
if id $1 &>/dev/null;then
echo "`grep ^$1 /etc/passwd | cut -d : f3.7`"
return 0
else
echo "$1 dose not exist"
return 1
fi
}
read -p "please input username:" username
until [ "$username" = "quit" -o "$username" = "exit" -o "$username" = "q" ]
do
user $username
if [ $? == 0 ];then
read -p "please input again:" username
else
read -p "no $username.please input again:" username
fi
done
实验三:函数库文件:在一个脚本中调用另一个脚本中的函数
[root@localhost ~]# vim fun1.sh
unction1 () {
echo "123"
}
function2 (){
echo "789"
}
[root@localhost ~]# vim fun2.sh
. fun1.sh
function1
function2
[root@localhost ~]# bash fun2.sh
123
789
实验四:利用递归求n的阶乘
[root@localhost ~]# vim fact.sh
fact () {
local n="$1"
if [ "$n" -eq 0 ];then
result=1
else
let "m=n-1"
fact "$m"
let "result=$n * $result"
fi
}
fact "$1"
echo "Factorial of $1 is $result"
[root@localhost ~]# bash fact.sh 5
Factorial of 5 is 120
实验五:完成9×9乘法表
(第一个方法)
[root@localhost ~]# vim jiujiuchengfa.sh
for i in {1..9}
do
for j in `eval echo $(echo {1..$i})`
do
echo -en "$i * $j = $(($i*$j))\t"
done
echo ""
done
(第二个方法)
[root@localhost ~]# vim jiujiuchengfa.sh
i=1
while [ $i -lt 10 ]
do
j=1
while [ $j -le $i ]
do
echo -en "$i * $j = $(($i*$j))\t"
let j++
done
echo ""
let i++
done
(第三种方法)
[root@localhost ~]# vim jiujiuchengfa.sh
i=1
j=1
while [ $i -lt 10 ]
do
if [ $j -le $i ];then
echo -en "$i * $j = $(($i*$j))\t"
let j++
else
echo ""
let i++
j=1
fi
done
(-n是不换行输出,-e \t就是识别\t这个转移字符)