shell的函数运用和数组

函数的基本定义:

# 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这个转移字符)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值