【问题标题】:Loop over set of strings containing spaces循环包含空格的字符串集
【发布时间】:2022-03-09 01:58:39
【问题描述】:

我有多个字符串,例如“a b”、“c d”、“foo bar”等。我想遍历这组字符串并对其中的每一个执行一个操作。在此操作中,我调用了多个其他脚本,因此我不想更改此循环的 IFS,因为它可能会破坏我对其他脚本的调用。这就是为什么我尝试转义这些字符串中包含的空格但没有成功的原因。

所以例如我希望得到

a b
c d

我尝试了以下方法:

#!/bin/sh

x="a b"
y="c d"

echo "Attempt 1"
all="$x $y"

for i in $all ; do
  echo $i
done

echo "Attempt 2"
all="a\ b c\ d"
for i in $all ; do
  echo $i
done

echo "Attempt 3"
all=($x $y)
for i in ${all[@]} ; do
  echo $i
done

echo "Attempt 4"
all='"'$x'" "'$y'"'
for i in $all ; do
  echo $i
done

echo "Attempt 5"
for i in "$x" "$y" ; do
  echo $i
done

echo "Attempt 6"
all2=("a b" "c d");
for i in ${all2[@]}; do
  echo $i
done

echo "Attempt 7"
all3="a b c d"
echo $all3|
while read i; do
  echo $i 
done 

仅尝试 5 成功,但我想这样做而不必为每个字符串声明一个变量,(维护起来会很痛苦)。我刚刚介绍了 x 和 y 进行测试,但想法是在一个变量中声明集合“a b”和“c d”。

【问题讨论】:

    标签: bash


    【解决方案1】:

    您需要将变量用双引号括起来,包括all=("$x" "$y")"${all[@]}"

    x="a b"
    y="c d"
    
    echo "Attempt XX"
    all=("$x" "$y")
    for i in "${all[@]}" ; do
      echo "$i"
    done
    

    产量:

    Attempt XX
    a b
    c d
    

    您还可以使用以下方式定义字符串:

    all=("a b" "c d")
    for i in "${all[@]}" ; do
      echo "$i"
    done
    

    【讨论】:

      【解决方案2】:

      您的问题是缺少引用。不加引号,就会出现分词:

      $ x="a b"; y="c d"; all=("$x" "$y"); for i in "${all[@]}"; do echo "$i"; done
      a b
      c d
      

      使用数组是最优雅的解决方案,当然xy 是多余的。你也可以这样做:

      $ all=("a b" "c d"); for i in "${all[@]}"; do echo "$i"; done
      a b
      c d
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-01
        • 2011-03-11
        相关资源
        最近更新 更多