Bash中数组参数循环函数的定义调用及${1}失效原因问询
Bash中数组参数的函数定义与调用问题
你遇到的核心问题是Bash函数无法直接接收完整数组作为单个位置参数。当你用echo_array "${to_be_bckd_p[@]}"调用函数时,数组的每个元素会被拆分成独立的位置参数传入函数,而不是把整个数组打包成$1。
- 对于
echo_fn "Hi"这种场景,你只传了单个字符串,$1就是这个字符串,所以能正常工作。 - 但在数组传递时,
${1[@]}会报错是因为$1只是数组的第一个元素,不是数组变量,自然不能用[@]语法。你之前注释里的${*[@]}、${@[@]}都是错误语法,因为$*和$@本身就是所有位置参数的集合,不需要再加[@]。
下面是几种正确的实现方式:
方法一:直接遍历函数内的所有位置参数
如果函数只需要处理传入的数组元素,不需要区分多个数组参数,可直接用${@}遍历所有传入的位置参数:
#!/usr/bin/bash to_be_bckd_p=("lightningd.sqlite3" "emergency.recover") prefs=("aaa" "bbbb") echo_array() { # 遍历所有传入的位置参数,对应原数组的每个元素 for fl in "${@}"; do echo "${fl}" done } echo_fn() { echo "${1}" } echo_array "${to_be_bckd_p[@]}" echo_array "${prefs[@]}" # 现在会正确遍历prefs数组的元素 echo_fn "Hi"
这种方式简单直接,适合只传递单个数组的场景。
方法二:传递数组名,用间接引用获取数组内容
如果需要在函数里区分多个数组参数,可以传递数组的变量名,再用Bash的间接引用语法获取数组内容:
#!/usr/bin/bash to_be_bckd_p=("lightningd.sqlite3" "emergency.recover") prefs=("aaa" "bbbb") echo_array() { local arr_name="$1" # 用间接引用遍历数组 for fl in "${!arr_name[@]}"; do echo "${!arr_name[$fl]}" done } echo_array "to_be_bckd_p" echo_array "prefs"
注意这种方式需要Bash 4.0及以上版本支持。
方法三:用命名参数传递数组(Bash 4.3+)
如果你的Bash版本是4.3及以上,可以用命名参数的方式直接传递数组:
#!/usr/bin/bash to_be_bckd_p=("lightningd.sqlite3" "emergency.recover") prefs=("aaa" "bbbb") echo_array() { local -n arr="$1" # -n 表示命名引用,指向传入的数组变量 for fl in "${arr[@]}"; do echo "${fl}" done } echo_array to_be_bckd_p # 这里不需要加引号和[@],直接传变量名 echo_array prefs
这种方式最直观,也能很好地处理多个数组参数的场景。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

