【问题标题】:Read command is parsing multiline input读取命令正在解析多行输入
【发布时间】:2018-07-30 14:03:40
【问题描述】:

以下代码中的read 命令仅解析输入的第一行。但当IFS 设置为逗号或换行符以外的任何其他符号时,它可以正常工作。

u="*
john
dan"

IFS=$'\n';read -ra q <<< "$u"

for j in "${q[@]}"
do
    echo "drop user $j"
done

输出只是:

drop user *

我期待的是:

drop user *
drop user john
drop user dan

请注意,输入中的第一项是星号。因此,如果我使用下面的代码进行拆分,那么星号会扩展到目录中的文件列表。

IFS=$'\n'; q=($u); unset IFS;

输出:

drop user abc
drop user test.sh
drop user john
drop user dan

上面的代码有什么问题?如何纠正它以获得预期的输出?

【问题讨论】:

    标签: bash shell parsing newline ifs


    【解决方案1】:

    你可以这样做while read循环:

    u="*
    john
    dan"
    while IFS= read -r user; do
        echo "drop user $user"
    done <<< "$u"
    

    输出:

    drop user *
    drop user john
    drop user dan
    

    【讨论】:

      【解决方案2】:

      read 只从标准输入中读取一行。如果你有 Bash 4.0 或更新版本,你可以使用readarray

      readarray -t q <<< "$u"
      

      之后你的数组看起来像这样:

      $ declare -p q
      declare -a q=([0]="*" [1]="john" [2]="dan")
      

      readarray(及其别名mapfile)默认使用换行符分隔数组元素,因此可以删除IFS 赋值。 Bash 4.4 引入了-d 选项来使用换行符以外的分隔符,但这不是必需的。

      一旦您的元素在数组中,您可以使用单个 printf 语句打印您的命令,如下所示:

      printf 'drop user %s\n' "${q[@]}"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 2014-09-22
        • 2013-06-10
        • 2015-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多