如何将数组传递给 bash shell 脚本?

Mow*_*zer 14 shell bash array shell-script

如何将数组作为变量从第一个 bash shell 脚本传递到第二个脚本。

第一个.sh
#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
sh second.sh "$AR" # foo
sh second.sh "${AR[@]}" # foo
Run Code Online (Sandbox Code Playgroud) 第二个.sh
#!/bin/bash
ARR=$1
echo ${ARR[@]}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,结果都是foo。但我想要的结果是foo bar baz bat.

我做错了什么,我该如何解决?

PSk*_*cik 13

AFAIK,你不能。您必须对其进行序列化和反序列化,例如通过参数数组:

第一的

#!/bin/bash
ar=('foo' 'bar' 'baz' 'bat')
second "${ar[@]}" #this is equivalent to: second foo bar baz bat
Run Code Online (Sandbox Code Playgroud)

第二

#!/bin/bash
arr=( "$@" )
printf ' ->%s\n' "${arr[@]}"
<<PRINTS
   -> foo
   -> bar
   -> baz
   -> bat
PRINTS
Run Code Online (Sandbox Code Playgroud)

一点建议:

  • exported 变量保留所有大写
  • 除非你有一个很好的具体理由不这样做,"${someArray[@]}"否则应该总是用双引号引起来;这个公式的行为完全像 'array item 0' 'array item 1' 'aray item 2' 'etc.' (假设someArray=( 'array item 0' 'aray item 1' 'aray item 2' 'etc.' )


Jay*_*got 5

AR阵列通过的第一个参数传递second.sh

第一个.sh

#!/bin/bash
AR=('foo' 'bar' 'a space' 'bat')
printf "AR array contains %d elements: " ${#AR[@]}
printf "%s " "${AR[@]}"
printf "\n"
./second.sh "$AR"
./second.sh "$(printf "(" ; printf "'%s' " "${AR[@]}" ; printf ")")"
Run Code Online (Sandbox Code Playgroud)

请注意,sh不再使用它来运行second.sh脚本。

这些链接printf用于伪造单个参数,如果某些数组元素包含空格字符,则该参数将是安全的。

第二个.sh

#!/bin/bash
declare -a ARR=$1
printf "ARR array contains %d elements: " ${#ARR[@]}
printf "%s " "${ARR[@]}"
printf "\n"
Run Code Online (Sandbox Code Playgroud)

----

对于AR使用任意数量的参数将数组传递给second.sh脚本的解决方案。

第一个.sh

#!/bin/bash
AR=('foo' 'bar' 'a space' 'bat')
printf "AR array contains %d elements: " ${#AR[@]}
printf "%s " "${AR[@]}"
printf "\n"
./second.sh "$AR"
./second.sh "${AR[@]}"
Run Code Online (Sandbox Code Playgroud)

第二个.sh

#!/bin/bash
ARR=( "$@" )
printf "ARR array contains %d elements: " ${#ARR[@]}
printf "%s " "${ARR[@]}"
printf "\n"
Run Code Online (Sandbox Code Playgroud)

----

考试:

$ chmod +x *sh
$ ./first.sh
AR array contains 4 elements: foo bar a space bat
ARR array contains 1 elements: foo
ARR array contains 4 elements: foo bar a space bat
Run Code Online (Sandbox Code Playgroud)