Shell脚本里函数和数组

本文详细介绍了函数的定义、调用、返回值、参数传递、函数文件、作用域以及递归,同时涵盖了数组的基础知识,包括定义、遍历和冒泡排序。

目录

壹、函数

一、函数的定义与调用 

二、函数查看与删除

 三、函数的返回值

 四、函数的传参数

五、使用函数文件

六、函数作用范围

七、递归 

贰、数组

一、基础数组

(1)定义数组格式:

(2)数组遍历:

二、冒泡数组


壹、函数

一、函数的定义与调用 

函数定义方式有三种

1.function 函数名{

}

2.函数名 (){

}

3.function 函数名 (){

}

【 注意事项

  1. 直接写 函数中调用函数 直接写函数名

  2. 同名函数 后一个生效

  3. 调用函数一定要先定义

  4. 只要先定义了调用的 其他函数定义顺序无关 】

二、函数查看与删除

函数查看使用  declare -F

删除函数使用  unset 函数名  进行删除

 三、函数的返回值

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

使用原则:

  1. 函数一结束就去返回值,应为$?变量只返回执行的最后一条命令的退出返回码

  2. 退出码必须是0-255,超出的值将为除以256取余

 如果想让返回值大于255,需要加一点设定

 四、函数的传参数

 【输入里zhaoqian作为$1,sunli作为$2,在脚本里是先输出$2,再输出$1,所以最后输出结果是suili,zhaoqian】

五、使用函数文件

在调用函数时可以将函数统一存放在一个函数文件里,在调用时直接调用文件里的函数就可以使用,而不需要再将函数写进脚本里

六、函数作用范围

 函数作用范围时作用在整体的

 如果想将变量限制在函数里需要使用local

七、递归 

函数递归就是在函数里调用自身函数

贰、数组

一、基础数组

(1)定义数组格式:
  1. 数组名=(value0 value1 value2 value3 ......)

  2. 数组名=([0]=value [1]=value1 [2]=value2 ....)

  3. 列表名="value0 value1 value2 value3 ...... "

    数组名=($列表名)

  4. 数组名[0]="value1"

    数组名[1]="value2"

    数组名[2]="value3"

(2)数组遍历:

遍历数组就是将数组里的元素从头到尾都查询一遍

二、冒泡数组

冒泡是通过数字比较 将大的数往后排小的数往前面排

 要将数组里的数字从小到大排序要先比较四次比较出最大的数,其次再比较三次比出第二大的数字,以此类推最后将5个数字按照大小排序

 冒泡数组进行排序

就可以得到根据从小到大的排序了 

<think>我们参考用户提供的引用内容,特别是引用[1]、[3]、[4][5]中关于数组的操作,来回答如何打印数组中的变量。 打印数组变量主要有以下几种方式: 1. 打印整个数组:使用`${array_name[@]}`或`${array_name[*]}`,两者在双引号中的行为不同(引用[3]中提到) 2. 打印数组长度:使用`${#array_name[@]}`或`${#array_name[*]}` 3. 打印指定索引的元素:使用`${array_name[index]}` 4. 打印数组的所有索引(对于普通数组,索引是0、1、2...等数字;对于关联数组,则是键名):使用`${!array_name[@]}`或`${!array_name[*]}` 具体到打印数组的变量(即数组元素),我们可以这样操作: 示例数组定义(参考引用[1]): test1=([0]=1 [1]=2 [2]=3) 方法1:打印整个数组 echo ${test1[*]} # 输出:1 2 3 或者 echo ${test1[@]} # 输出:1 2 3 方法2:逐个打印(遍历)数组元素 for i in "${test1[@]}"; do echo $i done 注意:当数组元素包含空格时,使用`"${array[@]}"`可以保证每个元素被单独处理(即使包含空格),而`"${array[*]}"`会将所有元素合并成一个字符串(用空格分隔)。参考引用[3]中关于`$*``$@`的区别。 另外,引用[4]给出了一个函数内部处理数组的例子,它通过将数组的所有元素作为参数传递给函数函数内部使用`$@`来接收,然后重新组装成数组。 打印关联数组(引用[2][5]提到关联数组): 首先,关联数组需要声明:`declare -A assoc_array` 然后可以赋值:`assoc_array=([key1]=value1 [key2]="value with space")` 打印所有值:`echo ${assoc_array[@]}` 打印所有键:`echo ${!assoc_array[@]}` 打印特定键的值:`echo ${assoc_array[key1]}` 因此,根据用户需求,我们给出以下详细方法: </think>### Shell脚本打印数组变量的方法 在Shell脚本中,打印数组变量需要根据具体需求选择合适的输出方式,以下是详细的解决方案: --- #### 1. 打印整个数组内容 ```bash # 定义数组 colors=("red" "green" "blue with space" "yellow") ``` **(1) 星号`*`格式(所有元素合并为单个字符串)** ```bash echo "全部元素: ${colors[*]}" # 输出:全部元素: red green blue with space yellow [^1] ``` **(2) 艾特`@`格式(保留元素独立性)** ```bash echo "独立元素: ${colors[@]}" # 输出: # 独立元素: red # 独立元素: green # 独立元素: blue with space # 独立元素: yellow [^3] ``` --- #### 2. 按索引打印特定元素 ```bash # 打印第2个元素(索引从0开始) echo "索引1的元素: ${colors[1]}" # 输出:索引1的元素: green # 打印带空格的元素(索引2) echo "复杂元素: '${colors[2]}'" # 输出:复杂元素: 'blue with space' [^5] ``` --- #### 3. 遍历打印所有元素 **(1) 标准for循环** ```bash for color in "${colors[@]}"; do echo "颜色: $color" done # 输出: # 颜色: red # 颜色: green # 颜色: blue with space # 颜色: yellow [^3][^4] ``` **(2) C语言风格循环(索引遍历)** ```bash for ((i=0; i<${#colors[@]}; i++)); do echo "索引$i: ${colors[i]}" done # 输出: # 索引0: red # 索引1: green # 索引2: blue with space # 索引3: yellow [^1] ``` --- #### 4. 打印数组元信息 ```bash # 数组长度 echo "元素总数: ${#colors[@]}" # 输出:元素总数: 4 [^1] # 所有索引值 echo "索引列表: ${!colors[@]}" # 输出:索引列表: 0 1 2 3 [^2] # 特定元素长度 echo "元素2长度: ${#colors[2]}" # 输出:元素2长度: 14 ``` --- #### 5. 特殊数组打印技巧 **(1) 稀疏数组(非连续索引)** ```bash sparse=([0]=a [3]=b [5]=c) printf "稀疏数组: " printf "%s " "${sparse[@]}" # 输出:稀疏数组: a b c [^5] ``` **(2) 关联数组(键值对)** ```bash declare -A user=([name]="John" [age]=30 [job]="Dev") echo "用户名: ${user[name]}" # 输出:用户名: John echo "全部值: ${user[@]}" # 输出:全部值: Dev 30 John echo "全部键: ${!user[@]}" # 输出:全部键: job age name [^2][^5] ``` **(3) 从文件加载数组** ```bash # 安全处理含空格的行 IFS=$'\n' files=($(find . -type f)) echo "找到 ${#files[@]} 个文件" # 输出:找到 15 个文件 [^5] ``` --- ### 易错点避坑指南 1. **忘加引号导致元素拆分** ```bash # 错误:空格元素被拆分成多个 for c in ${colors[@]}; do echo $c; done # 正确:保留元素完整性 for c in "${colors[@]}"; do echo $c; done [^3][^4] ``` 2. **索引与长度混淆** ```bash ${#colors} # 错误:返回第0个元素长度 ${#colors[@]} # 正确:返回元素数量 [^1] ``` 3. **稀疏数组遍历** 使用索引遍历代替元素遍历: ```bash # 跳过空元素 for idx in "${!sparse[@]}"; do echo "$idx: ${sparse[$idx]}" done ``` --- ### 最佳实践总结 | 场景 | 推荐方式 | 示例 | |-------------------|------------------------------|--------------------------| | 完整输出 | `"${array[*]}"` | 日志记录 | | 元素级处理 | `"${array[@]}"` + 引号 | 循环处理 | | 获取数量 | `${#array[@]}` | 条件判断 | | 键值对数组 | `declare -A` + `${!array[@]}`| 配置参数 | | 含空格元素 | 双引号包裹 `${array[i]}` | 文件路径处理 | > 💡 **调试技巧**:使用 `declare -p` 查看数组原始结构: > ```bash > declare -p colors > # 输出:declare -a colors=([0]="red" [1]="green" ...) > ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值