【问题标题】:Bash script read value is not meeting the comparisonBash 脚本读取值不符合比较
【发布时间】:2021-04-15 17:46:55
【问题描述】:

我正在读取 csv 文件并逐行回显。

#!/bin/bash 
while IFS=";" read username first last password
do
echo "I got:$username $first $last $password"
if [ -z "$password" ]
then
    echo "null"
fi
done < users.csv

这是我的 csv 文件,对于 null 密码,null 不会被回显。

lm;Lukáš;Masák;kjfask
spilk;Lukáš;Rasák;56456
kour;Lukáš;drtič;
hole;Lukáš;March;
lmmama;Lukáš;March;

【问题讨论】:

  • 请添加一个shebang,然后将您的脚本粘贴到shellcheck.net 并尝试实施那里提出的建议。
  • 测试命令应该是[ -z "$password" ]...在右括号丢失之前有一个空的espace。
  • shellcheck 在更改 if 后显示一切正常
  • 文件的行尾可能有一些不可见/非打印的内容。是在DOS/Windows format 中吗(在这种情况下,unix 工具会将这些行视为末尾有非打印回车)?最后的“;”后是否有空格或制表符在那些线上?在脚本开头添加命令set -x 将在它执行时打印一个跟踪,这可能会阐明正在发生的事情。
  • 当使用 set -x 时,它显示变量是 \r 但如果我将它与它进行比较它仍然不起作用

标签: bash csv syntax


【解决方案1】:

比较 [ "$password" = $'\r'] 有效。谢谢set -x

【讨论】:

  • 我不会推荐这个解决方案。如果您获得的文件不是 DOS/Windows 格式,则该测试将失败,并且对于当前文件,回车符(\r)也将出现在 do 有密码的行上,并且可能会导致那里出现问题。最好删除它而不是解决它。请参阅我链接的问题以获取可能的解决方案。您也可以只使用while IFS=$';\r' read ...', and let the read` 命令为您修剪它。
猜你喜欢
  • 2020-12-10
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 2021-03-08
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多