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