嵌套if语句不能使用while读取变量

时间:2014-07-23 21:33:40

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

我有一个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将被实际命令取代,这仅用于测试。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

还有另一个:

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'修剪前导空格和尾随空格。
  • 为了以防万一,添加了
  • __来存储剩余价值。

答案 2 :(得分:1)

您可以添加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