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 函数名{
     命令序列
}


或

函数名() {
     命令序列
}

例:

 

 

 

3.函数返回值

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

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

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

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

 

 4.函数的传参


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

 5.函数变量的作用范围

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

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

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

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

 

 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"

 

 7.递归目录

例:

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

 8.创建库

 二.数组

1.定义数组

方法一:

数组名=(value0 value1 value2 …)

方法二:

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

 方法三:

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

 方法四:

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

 数组包括的数据类型

● 数值类型

● 字符类型(字符串)

   使用" "或''定义

获取数组长度

 读取某个下标赋值

 2.数组遍历

 

 3.数组切片

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

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

4.数组替换

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

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

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

 

 

 5.数组删除

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

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

 

 6.数组追加元素

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

array_name[index]=value

方法二:

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

 方法三:

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

 方法四:

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

7.向函数传数组参数

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

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

  

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

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

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"

 

 

<think>首先,用户的问题是:“我想在Shell脚本中将数组作为参数传递函数的方法 请问Shell脚本如何将数组作为参数传递函数”。这直接询问如何在Shell脚本中传递数组作为函数参数。 我需要根据系统级指令来构建我的回答: - 所有行内数学表达式使用$...$格式,但这个问题是关于Shell脚本的,可能不涉及数学表达式。所以,我应该专注于文本部分。 - 独立公式使用$$...$$格式,但同样,这里可能不需要。 - LaTeX语法正确:由于没有数学内容,我可以忽略这个。 - 使用中文回答:整个回答必须是中文。 - 生成相关问题:在回答结束时,添加相关问题。 - 引用的段落末尾添加引用标识:如[^1],但用户提供了一些引用,我需要参考它们。引用来自用户消息:[^1], [^2], [^3], [^4]。这些是关于Shell脚本参数传递的总结。 用户可见层指令: - 回答结构清晰,逐步解决问题。 - 保证回答真实可靠。 参考提供的引用: - [^1]: 讨论Shell参数,包括普通参数传递。 - [^2]: 提到Shell函数数组在内存中的处理。 - [^3]: 具体说明如何将数组分解为单个值传递,并在函数内部重新组合。 - [^4]: 展示如何将数组作为参数传递给另一个脚本。 核心问题:在Shell脚本中将数组作为参数传递函数。 在Shell中(如Bash),数组不能直接作为单个参数传递,因为函数参数是按位置处理的。数组需要被分解或引用。 关键方法: 1. 将数组元素分解为多个参数。 2. 在函数内部,重新组合这些参数为一个数组。 步骤: - 定义一个数组:例如,`arr=("one" "two" "three")` - 传递数组时,使用`"${arr[@]}"`来展开所有元素作为单独的参数。 - 在函数中,使用`"$@"`来捕获所有参数,并赋值给一个新数组。 示例代码: ```bash #!/bin/bash # 定义一个函数 my_function() { # 捕获所有参数到一个新数组 local new_array=("$@") # 使用数组 for element in "${new_array[@]}"; do echo "$element" done } # 定义一个数组 my_array=("apple" "banana" "cherry") # 调用函数传递数组元素作为参数 my_function "${my_array[@]}" ``` 解释: - `"${my_array[@]}"` 展开数组的每个元素作为单独的参数。 - 在函数中,`"$@"` 捕获所有传入的参数。 - 然后赋值给 `new_array`。 根据引用[^3]:它提到需要将数组分解为单个值,然后在函数内部重新组合。这正是上面的方法。 引用[^4]:展示了传递给另一个脚本,但原理类似。 其他注意事项: - 使用`"${arr[@]}"`而不是`${arr[*]}`,因为`@`保持元素作为独立参数,而`*`可能合并为单个字符串。 - 在函数内部,使用`local`定义变量以避免污染全局作用域。 完整回答结构: 1. **介绍问题**:简要解释为什么直接传递数组困难。 2. **解决方案**:描述分解和重新组合的方法。 3. **代码示例**:提供清晰的代码示例。 4. **解释**:逐步解释代码。 5. **注意事项**:提到潜在问题,如空元素或特殊字符。 6. **生成相关问题**:在结束时添加相关问题。 相关问题: 1. 如何传递关联数组函数? 2. Shell脚本中如何处理数组元素的空值? 3. 如何从函数返回数组? 4. 在Bash中,数组和列表的区别是什么? 确保回答真实可靠:基于标准Bash实践,参考提供的引用。 最终回答用中文。</think>### Shell脚本中将数组作为参数传递函数的方法 在Shell脚本中,数组不能直接作为单个参数传递函数,因为函数参数是按位置处理的(即每个元素被视为独立参数)。因此,需要将数组元素分解为多个参数传递,并在函数内部重新组合为新数组。以下是基于Bash Shell的详细方法,参考了Shell参数传递的最佳实践[^1][^2][^3]。 #### 步骤说明 1. **定义数组**:创建一个数组变量。 2. **传递数组**:使用`"${array[@]}"`语法展开数组元素作为独立参数。 3. **函数内部处理**: - 在函数中,用`"$@"`捕获所有传入参数。 - 将参数赋值给一个新数组。 4. **使用数组**:在函数内部操作新数组。 #### 完整代码示例 ```bash #!/bin/bash # 定义函数:接收参数并重新组合为数组 my_function() { # 捕获所有参数并赋值给新数组 local new_array=("$@") # 打印数组元素 echo "函数数组元素:" for element in "${new_array[@]}"; do echo " $element" done } # 主脚本 # 1. 定义一个数组 my_array=("apple" "banana with space" "cherry") # 2. 调用函数传递数组元素作为独立参数 my_function "${my_array[@]}" # 输出结果示例: # 函数数组元素: # apple # banana with space # cherry ``` #### 关键点解释 - **分解数组**:`"${my_array[@]}"`确保数组的每个元素被展开为独立参数,保留空格和特殊字符(如`banana with space`不会被拆分)。 - **函数参数捕获**:`"$@"`在函数中捕获所有传入参数,`local new_array=("$@")`将它们重新组合为新数组。 - **作用域安全**:使用`local`定义函数内的数组变量,避免污染全局作用域[^2]。 - **为什么有效**:Shell参数本质上是变量,通过分解和重组实现数组传递[^1]。 #### 注意事项 - **空元素处理**:如果数组包含空元素(如`arr=("a" "" "c")`),需确保函数内部检查元素长度(例如:`for element in "${new_array[@]}"; do [ -n "$element" ] && echo "$element"; done`)。 - **Bash版本要求**:此方法在Bash 4.0+中可靠,旧版Shell(如sh)可能不支持数组。 - **关联数组**:如果是关联数组(键值对),需先转换为索引数组或使用`declare -A`[^3]。 通过这种方法,您可以高效地在Shell函数传递数组数据,提升脚本可读性和性能[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值