bash shell 脚本如何使用 space 构造数组元素

how bash shell script construct array element with space

我想用 space 构造数组元素,它在 运行 命令行中工作:

pc:/tmp$ b=('1 2' '3 4')
pc:/tmp$ echo $b
1 2
pc:/tmp$ echo ${b[1]}
3 4

但是它在脚本中用 space 分割元素:

pc:/tmp$ cat t.sh
a="'1 2' '3 4'"
echo $a
b=($a)
echo $b
echo ${b[1]}
echo ${b[2]}

pc:/tmp$ bash t.sh
'1 2' '3 4'
'1
2'
'3

我想用 echo $b 得到 '1 2' 就像在脚本中得到 '3 4'${b[1]} 一样。

我怎样才能做到这一点?

为什么它不能在脚本中运行但在命令行中运行?

代码 a="'1 2' '3 4'" 不会创建数组,它会创建一个带有嵌入式单引号的字符串。

$: a="'1 2' '3 4'"
$: echo "[$a]"
['1 2' '3 4']

如果你想创建一个数组,你必须使用正确的语法。

$: a=( '1 2' '3 4' )
$: printf "[%s]\n" "${a[@]}"
[1 2]
[3 4]

然后如果你想把它复制到另一个数组,就把它当作一个数组而不是一个字符串。

b=( "${a[@]}" )
printf "[%s]\n" "${b[@]}"
[1 2]
[3 4]

a="'1 2' '3 4'"中创建的字符串转换为数组有点棘手。

IF知道格式和上面一致匹配,试试这个:

$: echo "[$a]"
['1 2' '3 4']
$: IFS='#' read -ra b < <( sed -E "s/' +'/#/g; s/ *' *//g" <<< "$a" )
$: printf "[%s]\n" "${b[@]}"
[1 2]
[3 4]

但总的来说,这是一个糟糕的计划。尝试修复您的 input!