我正在制作一个 bash 脚本,但遇到了问题。所以假设我得到了这个
function create_some_array(){
for i in 0 1 2 3 .. 10
do
a[i]=$i
done
}
create_some_array
echo ${a[*]}
有什么办法可以使这项工作?我已经搜索了很多,但没有发现任何工作。我认为制作a[]
一个全局变量应该可以工作,但我找不到在我的代码中实际工作的东西。有没有办法将数组从函数返回到主程序?
提前致谢
我正在制作一个 bash 脚本,但遇到了问题。所以假设我得到了这个
function create_some_array(){
for i in 0 1 2 3 .. 10
do
a[i]=$i
done
}
create_some_array
echo ${a[*]}
有什么办法可以使这项工作?我已经搜索了很多,但没有发现任何工作。我认为制作a[]
一个全局变量应该可以工作,但我找不到在我的代码中实际工作的东西。有没有办法将数组从函数返回到主程序?
提前致谢
如所述,这可以正常工作。它在您的实际代码中不起作用的最可能原因是您碰巧在子外壳中运行它:
cat textfile | create_some_array
echo ${a[*]}
不起作用,因为管道中的每个元素都在子shell中运行,并且
myvalue=$(create_some_array)
echo ${a[*]}
不起作用,因为命令扩展发生在子shell中。
当数组中有空格时,这将无法按预期工作:
function create_some_array() {
local -a a=()
for i in $(seq $1 $2); do
a[i]="$i $[$i*$i]"
done
echo ${a[@]}
}
更糟糕的是:如果您尝试从外部“a”获取数组索引,结果是一个标量:
echo ${!a[@]}
即使分配为数组也无济于事,因为可能的引用自然会被回声线删除,并且无法操纵评估顺序以逃避引用:尝试
function create_some_array() {
...
echo "${a[@]}"
}
a=($(create_some_array 0 10))
echo ${!a[@]}
尽管如此, printf 似乎也无济于事:
function create_some_array() {
...
printf " \"%s\"" "${a[@]}"
}
一方面似乎产生了正确的输出:
$ create_some_array 0 3; echo
"0 0" "1 1" "2 4" "3 9"
但分配对另一个不起作用:
$ b=($(create_some_array 0 3))
$ echo ${!b[@]}
0 1 2 3 4 5 6 7
所以我的最后一个技巧是按如下方式进行分配:
$ eval b=("$(create_some_array 0 3)")
$ echo -e "${!b[@]}\n${b[3]}"
0 1 2 3
3 9
塔塔!
PS: printf "%q " "${a[@]}" 也可以正常工作...
您可以将数组设为函数的本地数组,然后将其返回:
function create_some_array(){
local -a a=()
for i in $(seq $1 $2); do
a[i]=$i
done
echo ${a[@]}
}
declare -a a=()
a=$(create_some_array 0 10)
for i in ${a[@]}; do
echo "i = " $i
done
嗨,这是我的解决方案:
show(){
local array=()
array+=("hi")
array+=("everything")
array+=("well?")
echo "${array[@]}"
}
for e in $(show);do
echo $e
done
试试这个代码:https ://www.tutorialspoint.com/execute_bash_online.php
这两种方法都对我有用sh
和bash
:
arr1=("192.168.3.4" "192.168.3.4" "192.168.3.3")
strArr=$(removeDupes arr1) # strArr is a string
for item in $strArr; do arr2+=("$item"); done # convert it to an array
len2=${#arr2[@]} # get array length
echo "${len2}" # echo length
eval arr3=("$(removeDupes arr1)") # shellcheck does not like this line and won't suppress it but it works
len3=${#arr3[@]} # get array length
echo "${len3}" # echo length
顺便说一句,removeDupes 函数如下所示:
removeDupes() {
arg="$1[@]"
arr=("${!arg}")
len=${#arr[@]}
resultArr=()
# some array manipulation here
echo "${resultArr[@]}"
}
此答案基于但更好地解释和简化了@Hans 和@didierc 的答案