bourne shell if [ -e $directory/file.$suffix ]

Bit*_*Nix 5 shell solaris test bourne-shell

#!/bin/sh
CONFIG_DIR="/var/opt/SUNWldm/"
read option
if [ $option -eq 9 ]; then
        ret=1
elif [ -e ${CONFIG_DIR}file.xml.${option} ]; then
        echo "TRUE"
fi
Run Code Online (Sandbox Code Playgroud)

我在 while 循环中有上面的代码来显示选项列表。不幸的是,我在elfi声明中遇到了问题。

From: IF for Beginners如果文件存在, -e 返回真。

我已经仔细检查了语法,甚至在调试模式下运行脚本(我放在set -x这个脚本的开头,可以看到中的替换if正确完成,如内联所示:

+ [ 201301271355 -eq 9 ]
+ [ -e /var/opt/SUNWldm/file.xml.201301271355 ]
./ldm_recover.sh: test: argument expected
Run Code Online (Sandbox Code Playgroud)

到目前为止,我一直在寻找并没有找到失败的原因,任何想法我做错了什么?

Gil*_*il' 6

伯恩贝壳有点像古董。Solaris 版本没有在 Bourne shell 生命周期中稍晚引入并由 POSIX-e提供的test(又名[)内置操作符。

作为一种解决方法,您可以使用-f来测试常规文件是否存在,或者-r如果您对不可读的文件不感兴趣。

更好的是,更改#!/bin/sh#!/usr/xpg4/bin/shor#!/bin/ksh以获得 POSIX shell。

请注意,这[ $option -eq 9 ]可能是不对的:-eq是一个数字比较运算符,但$option不是真正的数字——它是一个日期。在 32 位机器上,当201301271355被解释为数字时,取模 2 32。碰巧在 21 世纪没有日期非常接近 0 modulo 2 32,但依赖于此是非常脆弱的。做这个[ "$option" = 9 ]

作为一般的 shell 编程原则,始终在变量和命令替换周围加上双引号: "$foo", "$(foo)". 如果不这样做,shell 会在每个空白字符处拆分结果,并将每个结果单词视为文件名通配符模式。因此,$foo只有当 的值foo不包含任何空格或\[?*. 谨慎行事并始终使用双引号(除非您打算进行拆分和模式匹配)。

¹或者它是从未移植到 Bourne 的 ksh 添加?我不知道。