【问题标题】:How to preserve spaces in array elements when assigning values with "declare"?使用“声明”分配值时如何保留数组元素中的空格?
【发布时间】:2017-07-21 10:55:09
【问题描述】:

我想将一个字符串列表分配给一个数组。这些字符串包含我想保留的重要尾随空格。如下所示,当我单独分配数组元素时会保留空格。但是当我使用“declare”命令分配数组元素时,空格会丢失。一个尴尬的解决方案是使用“\”转义每个空格。有没有更好的方法,或者我缺少一些语法魔法?

代码:

echo "This does what I want:"
array1[0]="foo   "
array1[1]="bar   "

for element in "${array1[@]}"
do
  echo "${element}x"
done

echo "This makes me sad:"
declare -a array2=("foo   " "bar   ")

for element in "${array2[@]}"
do
  echo "${element}x"
done

echo "This too:"
declare -a array3=('foo   ' 'bar   ')

for element in "${array3[@]}"
do
  echo "${element}x"
done

echo "An awkward solution:"
declare -a array4=("foo\ \ \ " "bar\ \ \ ")

for element in "${array4[@]}"
do
  echo "${element}x"
done

输出:

This does what I want:
foo   x
bar   x
This makes me sad:
foox
barx
This too:
foox
barx
An awkward solution:
foo   x
bar   x

【问题讨论】:

  • 它对我来说可以正常工作。
  • ideone.com 演示:ideone.com/PKiioG
  • 当我使用你的“尴尬”解决方案时,我看到输出中的所有反斜杠。
  • 是的,我看了你的演示。我有旧版本的 bash(GNU bash,版本 2.05b.0(1)-release (i386-redhat-linux-gnu))。也许这就是问题所在?
  • 可能。这听起来像是旧版本中已修复的错误。您已经找到了该错误的解决方法,请使用它。

标签: arrays bash unix scripting


【解决方案1】:

我的测试与 cmets 匹配:这是旧版本 bash 中的一个错误,已在 2.05b.0 和 3.2.57 之间修复。但即使在旧版本中,如果您将声明与赋值分开,或者只是让声明作为数组是隐式的,它似乎也可以工作:

$ echo $BASH_VERSION
2.05b.0(1)-release
$ declare -a array1=('foo   ' 'bar   ')    # This triggers the bug
$ printf '"%s"\n' "${array1[@]}"
"foo"
"bar"
$ declare -a array2
$ array2=('foo   ' 'bar   ')    # Separate declaration - this works
$ printf '"%s"\n' "${array2[@]}"
"foo   "
"bar   "
$ array3=('foo   ' 'bar   ')    # Implicit declaration - also works
$ printf '"%s"\n' "${array3[@]}"
"foo   "
"bar   "

【讨论】:

  • 你是对的。在某个地方,我想到了我需要“声明”数组的想法。但是隐式声明可以正常工作并避免旧的 bash 错误。
  • @SagebrushGardener 你必须声明关联数组(使用declare -A),但无论如何它们都是 bash 版本 4 的东西......
猜你喜欢
  • 2014-12-14
  • 2013-10-30
  • 1970-01-01
  • 2020-09-21
  • 2019-03-13
  • 2018-01-02
  • 2013-02-03
  • 2016-11-03
  • 2019-11-25
相关资源
最近更新 更多