【问题标题】:Setting IFS to ignore whitespaces while reading from a here-string将 IFS 设置为在从此处读取字符串时忽略空格
【发布时间】:2018-08-08 17:18:23
【问题描述】:

我对 IFS 区分包和分发有一点问题。 现在想加上CentOS的版本号,但问题是CentOS和数字6是用IFS隔开的。 我的问题是,如何让 IFS 忽略空格并将它们视为单个值? 在此先感谢:)

...

PACKET_MANAGERS=(
    "Debian|package:package:package|apt:dpkg-query|"
    "CentOS 6|package:package:package|yum:rpm|${CentOS_6_REPO}"
    ...
)
...
   for system in ${PACKET_MANAGERS[@]}
do
    IFS='|' read -r -a data <<< $system
    debug "Testing ${system} => ${data[0]}"

    if echo "${SYSTEM_NAME}" | grep "${data[0]}" &>/dev/null; then
        SYSTEM_NAME_DETECTED="${data[0]}"
    else
        continue
    fi

...

done

【问题讨论】:

    标签: bash ifs


    【解决方案1】:

    您需要引用${PACKET_MANAGERS[@]}:

    for system in "${PACKET_MANAGERS[@]}"
    

    否则,将对扩展数组表达式的结果进行分词,因此数组的每个元素中的每个单词都将是 for 循环的单独迭代。使用[@] 将使每个数组元素在结果中成为一个单独的单词。

    【讨论】:

    • 您好,感谢您的回答,但不幸的是它不适用于“$system”?
    • 您还需要引用"${PACKET_MANAGERS[@]}"ShellCheck 指出了这两个问题。
    • 您只需引用$system 即可解决旧版本bash 中的错误。这里的字符串不应该进行分词。
    • 这还能如何实现?
    • @jamefane 我已经更新了答案说你需要引用${PACKET_MANAGERS[@]}
    猜你喜欢
    • 1970-01-01
    • 2018-02-09
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多