定义函数的两种方法 一是function sum {
二是直接 sum(函数名)()
方法一function sum {
read -p "请输入一个数字:" a
read -p 请输入第二个数字 b
c=$(($a+$b))
return $c
}
sum
echo $?
return表示退出函数并返回一个退出值
方法二
sum() {
read -p "请输入一个数字:" a
read -p 请输入第二个数字 b
c=$(($a+$b))
return $c
}
sum
echo $?
函数一结束就取回返回值,因为 $? 变量只返回执行的最后一条命令的退出状态码
返回码必须是0-255,超出的值将除以256取余
超出后结果要取模
加local函数内部变量传不出来
abc () {
echo "insert $i" i=9
let i++
local i
i=8
echo "inside2 $i" i=8
}
i=9
abc
echo "outside $i" i=10
sum () {
sum=$(($1+$2))
echo $sum
}
read -p "qingshuru" first
read -p "qingshuru" second
在这段Bash脚本中,函数 abc 定义了一个局部变量 i 并且打印出了三个不同的 i 的值。以下是参数传递的详细解释:
在函数定义内,使用 local i 语句声明了一个局部变量 i,它的作用域仅限于函数内部。这个局部变量 i 的值被设置为 8。
在 abc 函数的开头,它打印出 inside $i。由于在函数内部没有任何赋值语句,因此 $i 的值将与函数之前设置的全局变量 $i 的值相同,即为 9。
在 abc 函数的中间,使用 let i++ 语句增加了一个全局变量 i 的值。此时 $i 的值将变为 10。
在 abc 函数的结尾,它打印出 inside2 $i。此时局部变量 $i 的值为 8。
在函数调用之后,它打印出 outside $i。此时全局变量 $i 的值为 10。
因此,可以看出在这个例子中并没有使用函数参数传递,而是在函数内部定义了一个局部变量 $i。全局变量 $i 和局部变量 $i 的值在函数中被修改,但是在函数外部,只有全局变量 $i 被修改。
sum $first $second
sum $1 $2 时需要执行时赋值
阶乘函数(递归)函数调用自己的函数
dxl () {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[ $1-1 ]
local result=$( dxl $temp )
echo "$(($1*$result))"
fi
}
read -p "请输入你要求的阶乘" n
result=`dxl $n`
echo $result
遍历
list_files () {
for f in `ls $1`
do
if [ -d "$1/$f" ]
then
echo $2$f //$2视为空格区分父子目录可有可无
list_files "$1/$f" "$2"
else
echo "$2$f"
fi
done
}
list_file "/opt"
bash -x 分布查看执行
jiafa () {
result=$[$1+$2]
echo $result
}
jianfa () {
result=$[ $1-$2 ]
echo $result
}
cengfa () {
result=$[ $1*$2 ]
echo $result
}
chufa () {
if [ $2 -ne 0 ]
then
result=$[$1/$2]
echo $result
else
echo "$2不能为0"
fi
}
vim diaoyong.sh
#!/bin/bash
. /opt/hanshu2.sh source /opt/hanshu2.sh //用绝对路径写
read -p "请输入第一个参数:" first·
read -p "请输入第二个参数:" second
result1=$(jiafa $first $second)
result2=$(jianfa $first $second)
result3=$(chengfa $first $second)
result4=$(chufa $first $second)
echo "加法${result1}"
echo "减法${result2}"
echo "乘法${result3}"
echo "除法${result4}"
作业
while true
do
function pingtest {
read -p "请输入192.168.232.?,问号处的末位地址(0~254)" i
if [ $i -eq $i -a $i -ge 1 -a $i -le 254 ] ;then
ping -c 3 192.168.232.$i
if [ $? == 0 ]
then
echo "192.168.232.$i" >> /opt/host_ip
else
echo "地址联不通"
fi
else
echo "输入错误"
fi
}
pingtest
read -p "是否继续输IP(y/n)" a
if [ $a == y ]
then
pingtest
continue
elif [ $a == n ]
then
echo "欢迎下次用"
break
else
echo "您输入的不正确"
break
fi
done