shell脚本在一台服务器上正常工作,但不在另一台服务器

下面的脚本在一台服务器上工作正常,但另一台却出错

#!/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 

我只是想读取包含各种脚本path的文件,然后检查这些脚本是否已经运行,如果没有运行它们。 文件/var/www/iphorex/live/infi_script.txt是肯定存在的。 我在我的亚马逊服务器上出现以下错误 –

 [: 24: unexpected operator infinity.sh: 32: cannot open : No such file 

感谢您的帮助提前。

你应该只是初始化文件

 FILE = $ {1: - 在/ var / WWW / iphorex /现场/ infi_script.txt}

然后跳过存在检查。 如果文件不存在或者不可读,那么exec 0 <将会失败,并显示一个合理的错误信息(你试图猜测错误信息是什么,只要让shell报告错误就没有意义)。

我认为问题是,失败的服务器上的外壳不会像在平等测试中的“==”。 (许多测试的实现只接受'=',但我认为即使是旧的bash也有一个内置的接受两个'==',所以我可能会离开基地。)我会简单地从FILE =“”存在检查的结束并将其替换为上面的分配,让shell的标准默认机制为您工作。

请注意,如果你消除了存在检查,你会想要添加

设置-e

靠近脚本的顶部,或者在exec上添加一个检查:

 exec 0 <“$ FILE”|| 出口1

所以如果文件不可用,脚本不会继续。

对于bash(和ksh等),你需要[[ "$x" == "$y" ]]和双括号。 这使用内置的表达式处理。 一个括号呼叫到test可执行文件,这可能是对==的抨击。

此外,您可以使用[[ -z "$x" ]]来测试零长度字符串,而不是与空字符串进行比较。 请参阅bash手册中的“条件表达式”。