【问题标题】:nested if statement not working using while read variable嵌套 if 语句在使用 while 读取变量时不起作用
【发布时间】:2014-09-15 06:48:41
【问题描述】:

我有一个 csv 文件,我正在使用“while read”语句读取它,我想在 csv 中的一个字段上运行 if 语句。

======================================

csv 文件

client1,admin,password,5.9  
client2,admin,password,5.8  

======================================

这是我的脚本


while read clientid user pass version  
do  
    if [ '$version' = "5.9" ];  
    then  
        echo "IS"  
    else  
        echo "NOT"  
    fi  
done < $1  

问题是 if 语句不起作用。 当版本为 5.9 时,它不会回显 IS,它只是一直说 NOT,除非我将其更改为 !=
我尝试过使用单引号和双引号,即使没有...仍然无法按预期工作。

目标是运行命令直到文件结束。 该脚本是否正确执行此操作?

显然IS和NOT会被实际命令替换,这只是为了测试。

【问题讨论】:

  • 不计算被单引号括起来的变量。使用双引号。
  • 另外read 默认不会以逗号分隔。你需要告诉它这样做。在循环中打印出$clientid$user$pass$version 的值,看看你得到了什么。
  • 查看$IFS — 内部字段分隔符。 read(和许多其他程序)使用它来分隔文本字符串。
  • 我确实在脚本中有 IFS=","。如果我回显 $version,它会显示 5.9
  • @baum: 你能提供一个带有IFS=,read -d, 的工作示例脚本吗?使用它时,我得到了非常奇怪的输出。

标签: bash csv if-statement while-loop nested


【解决方案1】:

提供的示例 csv 文件在行尾有空格,可以使用参数扩展从 version 变量中删除。

这应该可行:

while IFS=, read -r clientid user pass version; do
    if [ "${version//[[:space:]]/}" = "5.9" ]; then
        echo "IS"
    else
        echo "NOT"
    fi
done < $1

【讨论】:

    【解决方案2】:

    还有一个:

    while IFS=$' \t\r\n' read -r line; do
        IFS=, read -r clientid user pass version __ <<< "$line"
        if [[ $version == '5.9' ]]; then
            echo "IS"
        else
            echo "NOT"
        fi
    done < "$1"
    
    • 始终在打开时引用变量以防止分词和路径名扩展。
    • 首选[[ ]] 而不是[ ]。它不进行分词和路径名扩展。
    • IFS=$' \t\r\n' 删除前导和尾随空格。
    • __ 被添加到存储剩余价值以防万一。

    【讨论】:

      【解决方案3】:

      您可以添加 IFS 值逗号和空格 IFS=', ' 。你会得到准确的结果。

      #!/bin/bash
      IFS=', '
      while read clientid user pass version  
      do
          if [ "$version" == "5.9" ] ; then
              echo "IS"  
          else
              echo "NOT"  
          fi
      done < $1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-28
        • 2013-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多