以下脚本在一台服务器上运行良好,但另一台服务器则出错
#!/bin/bash
processLine(){
line="$@" # get the complete first line which is the complete script path
name_of_file=$(basename "$line" ".php") # seperate from the path the name of file excluding extension
ps aux | grep -v grep | grep -q "$line" || ( nohup php -f "$line" > /var/log/iphorex/$name_of_file.log & )
}
FILE=""
if [ "$1" == "" ]; then
FILE="/var/www/iphorex/live/infi_script.txt"
else
FILE="$1"
# make sure file exist and readable
if [ ! -f $FILE ]; then
echo "$FILE : does not exists. Script will terminate now."
exit 1
elif [ ! -r $FILE ]; then
echo "$FILE: can not be read. Script will terminate now."
exit 2
fi
fi
# read $FILE using the file descriptors
# $ifs is a shell variable. Varies from version to version. known as internal file seperator.
# Set loop separator to end of line
BACKUPIFS=$IFS
#use a temp. variable such that $ifs can be restored later.
IFS=$(echo -en "\n")
exec 3<&0
exec 0<"$FILE"
while read -r line
do
# use $line variable to process line in processLine() function
processLine $line
done
exec 0<&3
# restore $IFS which was used to determine what the field separators are
IFS=$BAKCUPIFS
exit 0
我只是想读取包含各种脚本路径的文件,然后检查这些脚本是否已经在运行,如果没有运行它们。文件/var/www/iphorex/live/infi_script.txt
肯定存在。我在亚马逊服务器上收到以下错误 -
[: 24: unexpected operator
infinity.sh: 32: cannot open : No such file
提前感谢您的帮助。
答案 0 :(得分:3)
您应该只使用
初始化文件FILE=${1:-/var/www/iphorex/live/infi_script.txt}
然后跳过存在检查。如果是文件 不存在或不可读,exec 0&lt;将 失败并带有合理的错误信息(没有意义 在你试图猜测错误信息是什么, 让shell报告错误。)
我认为问题在于故障服务器上的shell 在等式测试中不喜欢“==”。 (许多实现 测试只接受一个'=',但我认为甚至更老的bash 有一个内置接受两个'=='所以我可能会离开基地。) 我只是简单地从FILE =“”消除你的行 存在的结束检查并用它替换它们 上面的赋值,让shell的标准默认值 机制为你工作。
请注意,如果您确实取消了存在检查,那么您需要 添加
set -e
靠近脚本顶部,或者在exec上添加一个检查:
exec 0<"$FILE" || exit 1
以便在文件不可用时脚本不会继续。
答案 1 :(得分:1)
对于bash(以及ksh和其他人),您希望[[ "$x" == "$y" ]]
带有双括号。它使用内置表达式处理。一个括号调用test
可执行文件,这可能是在==。
此外,您可以使用[[ -z "$x" ]]
来测试零长度字符串,而不是与空字符串进行比较。请参阅bash手册中的“有条件的表达”。