Shell函数、数组

目录

一.shell函数

1.什么是shell函数

2.shell函数的格式

3.函数返回值

 4.函数的传参

 5.函数变量的作用范围

 6.递归

 7.递归目录

 8.创建库

 二.数组

1.定义数组

 2.数组遍历

 3.数组切片

4.数组替换

 5.数组删除

 6.数组追加元素

7.向函数传数组参数

8.从函数返回数组


一.shell函数

1.什么是shell函数

将命令序列按格式写在一起

可方便重复使用命令序列

2.shell函数的格式

function 函数名{
     命令序列
}


或

函数名() {
     命令序列
}

例:

Shell函数、数组_第1张图片

 

 Shell函数、数组_第2张图片

 

3.函数返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值使用原则:

1、函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码

2、退出状态码必须是0~255,超出时值将为除以256取余

#!/bin/bash
function db1 {
  read -p "请输入: " value
  return $[$value * 2]
}
db1
echo $?

Shell函数、数组_第3张图片

 

 4.函数的传参


#!/bin/bash
sum1() {
  sum=$[$1 + $2]
  echo $sum
}
read -p "输入第一个参数:" first
read -p "输入第二个参数:" second
sum1 $first $second
  res=$(sum1)
  echo $res             

Shell函数、数组_第4张图片

Shell函数、数组_第5张图片

 5.函数变量的作用范围

函数在shell脚本中仅在当前shell环境中有效

Shell脚本中变量默认全局有效

将变量限定在函数内部使用local命令

#!/binbash
myfun() {
  local i
  i=2
  echo $i
}
i=3
myfun
echo $i

Shell函数、数组_第6张图片

 Shell函数、数组_第7张图片

 6.递归

函数调用自己本身的函数

#!/bin/bash
fact() {
  if [ $1 -eq 1 ];then
      echo 1
  else
      local temp=$[$1 - 1]
      local result=$(fact $temp)
      echo $[$1 * $result]
  fi
}
read -p "请输入一个阶乘的数字: " n
result=$(fact $n)
echo "阶乘的结果为$result"

Shell函数、数组_第8张图片

 Shell函数、数组_第9张图片

 7.递归目录

例:

mkdir -p /root/bin/aa/bb/cc/dd ; touch /root/bin/aa/bb/cc/dd/abc.txt,输出环境变量PATH所包含的所有目录以及其中的子目录和所有不可执行文件

Shell函数、数组_第10张图片

Shell函数、数组_第11张图片

 8.创建库

Shell函数、数组_第12张图片

Shell函数、数组_第13张图片

 二.数组

1.定义数组

方法一:

数组名=(value0 value1 value2 …)

Shell函数、数组_第14张图片

方法二:

数组名=([0]=value [1]=value [2]=value …)

 方法三:

列表名=“value0 value1 value2 …”
数组名=($列表名)

 方法四:

数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”

Shell函数、数组_第15张图片

 数组包括的数据类型

● 数值类型

● 字符类型(字符串)

   使用" "或''定义

获取数组长度

Shell函数、数组_第16张图片

 读取某个下标赋值

 2.数组遍历

Shell函数、数组_第17张图片

 Shell函数、数组_第18张图片

 3.数组切片

arr=(1 2 3 4 5 6)     #定义数组
 
echo ${arr[*]}        #输出整个数组

echo ${arr[@]:0:2}    #获取 ${数组名[@或*]:起始位置:长度} 的值

Shell函数、数组_第19张图片

4.数组替换

数组替换
arr=(1 2 3 4 5)              #定义数组

echo $ {arr[@]/4/66}         #${数组名[@或*]/查找宁符/替换字符}
echo $ {arr[@]}              #并不会替换数组原有内容

arr=(${arr[@]/4/66})     #要实现改变原有数组,可通过重新赋值实现
echo $ {arr[@]}

 Shell函数、数组_第20张图片

 Shell函数、数组_第21张图片

 5.数组删除

arr=(1 2 3 4 5)
unset arr          #删除数组
echo $ (arr[ * ]}

arr= (1 2 3 4 5)
unset arr[2]       #删除第三个元素
echo $ {arr[* ]}

Shell函数、数组_第22张图片

 Shell函数、数组_第23张图片

 6.数组追加元素

方法一:根据索引单个元素添加

array_name[index]=value

Shell函数、数组_第24张图片

方法二:

array_name[${#array_name[@]}]=value

Shell函数、数组_第25张图片

 方法三:

方法三:
array_name=("${#array_name[@]}" value1 value2 ... valueN)
双引号不能省略,否则数组中存在包含空格的元素时会按空格将元素拆分成多个
不能将“@”替换为“*”,如果替换为“*”,不加双引号时与“@”的表现一致,加双引号时,会将数组array_name中的所有元素作为一个元素添加到数组中

Shell函数、数组_第26张图片

 方法四:

array_name+=(value1 value2 ... valueN) 注:待添加元素必须用“()”包围起来,并且多个元素用空格分隔

Shell函数、数组_第27张图片

7.向函数传数组参数

如果将数组变量作为函数参数,函数只会取数组变量的第一个值。

test1() {
  echo "接收到的参数列表:s@"
  newarrary=($1)
  echo "新数组的值为: ${newarrary[*]}”
}
array=(10 20 30 40 50)
echo "原始数组的值为: ${array[*]}"
test1 $array

Shell函数、数组_第28张图片

Shell函数、数组_第29张图片  

解决这个问题则需要将数组变量的值分解成单个的值,然后将这些值作为函数参数使用。在函数内部,再将所有的参数重新组合成一个新的数组变量。

test2() {
  newarrary=($(echo $@))
  echo "新数组的值为: ${newarrary[*]}"
}
array=(10 20 30 40 50)
echo "原始数组的值为: ${array[*]}"
test2 ${array[*]}

Shell函数、数组_第30张图片

Shell函数、数组_第31张图片

8.从函数返回数组

#!bin/bash
test2() {
  newarrary=(`echo $@`)

  sum=0
  for value in ${newarrary[*]}
  do
    sum=$[$sum + $value]
  done
  echo $sum
}
test3() {
  newarrary=(`echo $@`)
  for ((i=0; i<=$[$# - 1]; i++))
  {
    newarrary[$i]=$[${newarrary[$i]} * 2]
  }
  echo ${newarrary[*]}
}
array=(10 20 30 40 50)
echo "原始数组的值为: ${array[*]}"
result1=`test2 ${array[*]}`
echo "新数组的和为: $result1"

 Shell函数、数组_第32张图片

 

你可能感兴趣的:(shell,linux,centos)