【问题标题】:how bash shell script construct array element with space [duplicate]bash shell脚本如何用空格构造数组元素[重复]
【发布时间】:2021-11-19 16:30:17
【问题描述】:

我想用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

我想在脚本中获取'1 2'echo $b,就像获取'3 4'${b[1]}

我怎样才能做到这一点?

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

【问题讨论】:

  • b=($a) 在空白处分割字符串。您必须为您的 a 编写一个解析器才能将其拆分。
  • 如果您在命令行中测试了b=($a),它的行为方式与您在脚本中的行为方式相同。这不是脚本与命令行的区别。
  • 顺便说一句,在重复的答案中,我强烈建议找到一个使用 Python shlex 模块(如果您想要最接近真实 POSIX sh 解析器的准确性)或 @987654333 @ (如果你想要一些随处可用的东西,并且不会添加比xargs 强制更多的错误)。
  • @CharlesDuffy THX,感谢您抽出宝贵时间,也许我应该提高我的搜索技巧,所有相关问题都有帮助。

标签: arrays bash shell whitespace


【解决方案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'" 中创建的字符串 转换 为数组有点棘手。

如果知道格式与上述一致,试试这个:

$: 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]

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

【讨论】:

  • 我的意思是我有一个字符串变量a="'1 2' '3 4'",我怎么能把它翻译成一个数组?谢了。
  • 这有点难。这种格式的一致性如何?
  • 我们已经有现有的知识库条目可以满足 OP 的要求。
  • @PaulHodges THX,模式和我的一致,可以解决我的问题,THX。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 2011-07-19
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多