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)
到目前为止,我一直在寻找并没有找到失败的原因,任何想法我做错了什么?
伯恩贝壳有点像古董。Solaris 版本没有在 Bourne shell 生命周期中稍晚引入并由 POSIX-e
提供的test
(又名[
)内置操作符。
作为一种解决方法,您可以使用-f
来测试常规文件是否存在,或者-r
如果您对不可读的文件不感兴趣。
更好的是,更改#!/bin/sh
为#!/usr/xpg4/bin/sh
or#!/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 添加?我不知道。
归档时间: |
|
查看次数: |
6134 次 |
最近记录: |