如何解决Bash-局部变量与全局变量的数组长度赋值
我有以下脚本:
为简单起见,我删除了replace变量以更轻松地显示当前行为:
declare -a CHARACTERS_SEARCHFOR=("-" ".")
declare -a CHARACTERS_REPLACEWITH=("X" "Y")
function replacerCharacters(){
local searchers="${CHARACTERS_SEARCHFOR[@]}"
local searchers2="${CHARACTERS_SEARCHFOR}"
echo "Count Original: ${#CHARACTERS_SEARCHFOR[@]}"
echo "Count Assigned: ${#searchers[@]}"
echo "Count Assigned Alternative: ${#searchers2[@]}"
echo "Content Original: ${CHARACTERS_SEARCHFOR[@]}"
echo "Content Assigned: ${searchers[@]}"
echo "Content Assigned Alternative: ${searchers2[@]}"
}
replacerCharacters
这给了我以下输出:
Count Original: 2
Count Assigned: 1
Count Assigned Alternative: 1
Content Original: - .
Content Assigned: - .
Content Assigned Alternative: -
很明显$searchers2
语法是错误的,我期望这是正确的,但是用它来测试为什么$searchers
返回一项,但是“在视觉上”具有与数组。
如何正确分配局部变量以接收数组作为输入?
最后我想做这样的事情:最好通过命令行提供参数---但我认为在命令行上提供数组可能会有所不同
function replacerCharacters(){
local searchers="$1"
local replacers="$2"
for index in "${!searchers[@]}"; do
itemSearch="${searchers[$index]}"
itemReplace="${replacers[$index]}"
done
}
replacerCharacters "${SOME_OTHER_ARRAY[@]}" "${SOME_OTHER_REPLACERS[@]}"
解决方法
如果要将多个数组作为参数传递,则必须将它们作为名称引用(Bash的nameref
)传递,或者将所有包含的值扩展为单个参数。
Nameref变量
#!/usr/bin/env bash
declare -a CHARACTERS_SEARCHFOR=("-" ".")
declare -a CHARACTERS_REPLACEWITH=("X" "Y")
replacerCharacters(){
# searches and replacers are nameref variables
local -n searchers="$1"
local -n replacers="$2"
for index in "${!searchers[@]}"; do
itemSearch="${searchers[$index]}"
itemReplace="${replacers[$index]}"
done
}
# Pass arrays as names
replacerCharacters SOME_OTHER_ARRAY SOME_OTHER_REPLACERS
,
如何正确分配局部变量以接收数组作为输入?
变量是局部变量还是全局变量都没有关系。在这两种情况下,都应像在手动数组定义中那样使用括号。
array=("${otherArray[@]}")
最好通过命令行提供参数---但我认为在命令行上提供数组可能有所不同
您可以提供一个阵列就可以了
f() {
local x=("$@")
declare -p x
}
a=(1 2 3)
f "${a[@]}"
但是对于多个数组(如f "${a[@]}" "${b[@]}"
)存在问题。该函数不知道第一个数组在哪里结束,第二个数组在哪里开始。你可以
- 通过指定第一个数组的长度来指示开始/结束
f() {
local xlen="$1";
shift
x=("${@:1:xlen}") y=("${@:xlen+1}")
declare -p x y
}
...
f "${#a[@]}" "${a[@]}" "${b[@]}"
- 通过插入定界符(
f "${a[@]}","${b[@]}"
)指示开始/结束,定界符不能出现在数组中。
f() {
local dpos=$(printf %s\\0 "$@" | grep -zFxnm1 DELIM | sed 's/:.*//');
x=("${@:1:dpos-1}") y=("${@:dpos+1}")
declare -p x y
}
...
f "${a[@]}" DELIM "${b[@]}"
- 不传递数组,而是only their names(
f a b
)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。