【问题标题】:while loop to echo variable until empty in Bashwhile循环回显变量直到在Bash中为空
【发布时间】:2020-02-23 08:08:42
【问题描述】:

这是我们在 $foo 变量中的内容:

abc bcd cde def

我们只需要回显变量的第一部分,并重复执行此操作,直到没有任何剩余。

例子:

$ magic_while_code_here
I am on abc
I am on bcd
I am on cde
I am on def

它会首先使用开头的单词,然后将其从变量中删除。先用开头的词,以此类推,直到为空,然后退出。

所以变量将是abc bcd cde def,然后是bcd cde def,然后是cde def,等等。

我们会展示我们已经尝试过的东西,但我们不确定从哪里开始。

【问题讨论】:

    标签: bash variables while-loop


    【解决方案1】:

    我会使用read -a 将字符串读入一个数组,然后打印出来:

    $ foo='abc bcd cde def'
    $ read -ra arr <<< "$foo"
    $ printf 'I am on %s\n' "${arr[@]}"
    I am on abc
    I am on bcd
    I am on cde
    I am on def
    

    -r 选项确保$foo 中的反斜杠不会被解释; read -a 允许您在 $foo 中包含任何您想要的字符并在空格处分割。


    或者,如果您可以使用 awk,您可以像这样遍历所有字段:

    awk '{for (i=1; i<=NF; ++i) {print "I am on", $i}}' <<< "$foo"
    

    【讨论】:

      【解决方案2】:

      如果需要使用while循环,从字符串的开头切分,可以使用cut命令。

      foo="abc bcd cde def"
      
      while :
      do
        p1=`cut -f1 -d" " <<<"$foo"`
        echo "I am on $p1"
        foo=`cut -f2- -d" " <<<"$foo"`
        if [ "$p1" == "$foo" ]; then
          break
        fi
      done
      

      这将输出:

      I am on abc
      I am on bcd
      I am on cde
      I am on def
      

      【讨论】:

      • 请注意,反引号`是discouraged$( .. ) 命令替换是非常受欢迎的。
      【解决方案3】:

      假设变量仅包含由空格或制表符或换行符分隔的字母字符序列,我们可以(ab-)使用分词扩展,只需执行printf

      foo="abc bcd cde def"
      printf "I am on %s\n" $foo
      

      将输出:

      I am on abc
      I am on bcd
      I am on cde
      I am on def
      

      【讨论】:

        猜你喜欢
        • 2014-03-02
        • 1970-01-01
        • 2017-11-29
        • 1970-01-01
        • 2018-09-30
        • 2021-11-03
        • 1970-01-01
        • 2011-01-16
        • 2023-03-08
        相关资源
        最近更新 更多