【问题标题】:bash create for loop with an array variablebash用数组变量创建for循环
【发布时间】:2017-05-26 07:38:16
【问题描述】:

我试图通过 for 循环读取命令的输出,但是以这样一种方式,循环变量将是一个数组。那可能吗? 这是我迄今为止一直在尝试的:

function samplevals() {
    echo '"aa bb"'
    echo '"cc dd"'
    echo '"ee ff" "gg hh"'
}

samplevar='"aa bb"
"cc dd"
"ee ff" "gg hh"'

echo call function samplevals:
for x in `samplevals `; do echo ">$x<"; done

echo read variable samplevar:
echo $samplevar
for x in $samplevar; do echo ">$x<"; done

echo process output of 'echo samplevar:'
for x in `echo $samplevar`; do echo ">$x<"; done

echo "the thing with set"
for x in $samplevar; do set -- $x ; echo "\$1=>$1<,\$2=>$2<"; done

但输出总是一样的:

>"aa<
>bb"<
>"cc<
>dd"<
>"ee<
>ff"<
>"gg<
>hh"<

我能否以某种方式阻止 bash 将元素拆分成更小的部分?

【问题讨论】:

  • 引号是文字数据,不是句法引号。您的代码中没有任何数组。

标签: arrays bash for-loop


【解决方案1】:

bash中定义数组的方式是

samplevars=("aa bb" "cc dd" "ee ff" "gg hh")
for x in "${samplevars[@]}"; do
    echo ">$x<"
done

【讨论】:

  • 没有简单的方法从命令输出创建数组,因为bash中没有数组这样的东西,只有数组 parameters 的语法给出了数组值的外观。数组实际上更接近于一组松散相关的单个变量,并通过一些语法糖捆绑在一起。
  • 这几乎可以工作。在第一行将 samplevars 更改为 samplevar。
【解决方案2】:

按照chepner's answer 的思路,使用read 命令。该命令的-a 标志部分允许将输出写入数组。

IFS=$'\t' read -ra arrayDef < <(echo -ne '"abc def"\t"ghi jkl"')
for x in "${arrayDef[@]}"; do
    echo ">$x<"
done

您可以将echo 部分替换为生成此类字符串的某些命令。请记住适当地更新 IFS 以了解字符串的分隔方式。就我而言,我只是将字符串由\t

【讨论】:

  • 这只是将“分隔符”从任意空格转移到一个制表符。它不能解决保证不会出现在数组元素中的分隔符的根本问题。
  • @chepner:最初提供这个作为替代补充逻辑看到你的,但看到 OP 不批准你的。要我删除吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2020-06-09
  • 2013-12-04
  • 1970-01-01
  • 2018-02-18
  • 2012-01-21
相关资源
最近更新 更多