【问题标题】:String comparison in ksh never succeedingksh中的字符串比较从未成功
【发布时间】:2015-05-01 01:03:38
【问题描述】:

我有下一个脚本,当尝试比较变量值是否等于“NO”或“SI”(西班牙语中是)时,由于某种原因它不起作用,我一直在通过 else (SI) 虽然变量中的实际值为“否”。它甚至被打印在电子邮件主题中。

我担心我可能是一些我看不到的额外隐形角色,但它就在那里?

这是脚本:

#!/usr/bin/ksh

VAR=$(/home/userName/scripts/loadedresource.ksh | egrep 'SI|NO')

MAIL_FILE="testfile.txt"

rm -f $MAIL_FILE

echo "From:Script" > $MAIL_FILE
echo "To:Me<me@company.com>" >> $MAIL_FILE
echo "Subject:RESOURCE LOADED-> $VAR" >> $MAIL_FILE
echo "Content-Type: text/html" >> $MAIL_FILE
echo "<html>" >> $MAIL_FILE
echo "<body style='font-family:calibri;font-size:14px;'>" >> $MAIL_FILE


if [ "$VAR" == "NO" ]
then
    echo "<h2> Resource not loaded, please open ticket </h2>" >> $MAIL_FILE
else
    echo "<h2> Resource loaded successfully </h2>" >> $MAIL_FILE
fi

mail me@company.com < $MAIL_FILE

【问题讨论】:

  • 使用ksh -x yourscript 查看执行过程中实际发生了什么。 ksh 有许多不同的实现,因此很难给出一个保证正确的答案。
  • ...另外,使用set -x 进行调试将正确通知您任何隐藏字符。
  • 另外,不要每行使用一次&gt;&gt;$MAIL_FILE - 这是非常低效的(它会为每个回显重新打开文件)。
  • 另外,不要在 shell 中对本地变量使用全大写的变量名;按照惯例,这些名称是为环境变量和内置函数保留的。

标签: variables comparison ksh


【解决方案1】:

== 在 POSIX 测试中不是有效的比较运算符。如果您的 ksh 特定实现没有实现添加它的扩展,您可能需要使用

if [ "$VAR" = "NO" ]

而不是

if [ "$VAR" == "NO" ]

如果您的副本具有 GNU 扩展,我还考虑使用 egrep -o 'SI|NO' 来从 grep 的输出中省略任何其他字符。


作为另一种选择,请考虑:

result=$(/home/userName/scripts/loadedresource.ksh)
case $result in
  *SI*) echo "Yes" ;;
  *NO*) echo "No" ;;
  *) echo "Unknown" ;;
esac

顺便说一下,作为性能增强:

{
  echo "hello"
  echo "world"
} >output.txt

...比

高效得多
echo "hello" >output.txt
echo "world" >>output.txt

...每行重新打开一次输出文件。

【讨论】:

  • 感谢您提供有关提高效率的提示,我刚刚应用了这些更改。这样做之后,它一直没有比较正确,我的 egrep 实现不承认 -o 作为一个选项,它只是承认(来自 man egrep): -b -c -e -f -h -i -l -n -s - v 和 -x
  • 你知道你的ksh版本是否支持[[ $foo =~ $bar ]]
  • @wagger, ...实际上,我添加了另一个选项,使用 case 内置函数,根本不依赖 grep
  • 感谢您提供有关提高效率的提示,我刚刚应用了这些更改。这样做之后,它一直没有比较正确,我的 egrep 实现不承认 -o 作为一个选项,它只是承认(来自 man egrep): -b -c -e -f -h -i -l -n -s - v 和 -x 通过使用 ksh -x 脚本名执行,我得到下一个结果,我不确定在“NO”之后是否添加了另一个字符:+ echo = NO ] + echo

    资源加载成功!

  • @wagger, ...是的,用所示的 case 语句替换 grep 应该可以。
猜你喜欢
  • 1970-01-01
  • 2015-04-21
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多