我想提出一个bash脚本,我已经遇到了一个问题。 所以我们可以说我得到了这个
function create_some_array(){
for i in 0 1 2 3 .. 10
do
a[i]=$i
done
}
create_some_array
echo ${a[*]}
有没有什么办法可以使这项工作? 我已经搜索了很多,并没有发现我的工作。 我想制作a[]
的全局变量应该工作,但我无法找到的东西,实际工作在我的代码。 有没有办法返回从功能到主程序数组?
提前致谢
描述这工作得很好。 最可能的原因并不在你的实际代码工作是因为你碰巧在子shell中运行它:
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
done
echo ${a[@]}
}
declare -a a=()
a=$(create_some_array 0 10)
for i in ${a[@]}; do
echo "i = " $i
done
这不会按预期当有数组中的空格:
function create_some_array() {
local -a a=()
for i in $(seq $1 $2); do
a[i]="$i $[$i*$i]"
done
echo ${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
TATAAA!
PS:printf的 “%Q” “$ {A [@]}”,也能正常工作?
你好,这里是我的解决方案:
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