shell脚本错误

时间:2011-03-11 13:55:52

标签: linux shell

我有这样的shell脚本。

line="$@" # get the complete first line which is the complete script path 
name_of_file = ${line%.*}
file_extension = ${line##*.}
if [ $file_extension == "php"]
then
ps aux | grep -v grep | grep -q "$line" || ( nohup php -f "$line" > /var/log/iphorex/$name_of_file.log & ) 
fi
if [ $file_extension == "java"]
then
ps aux | grep -v grep | grep -q "$line" || ( nohup java -f "$name_of_file" > /var/log/iphorex/$name_of_file.log & )
fi

此处,行变量的值为/var/www/dir/myphp.php/var/www/dir/myjava.java

shell脚本的目的是检查这些进程是否已在运行,如果没有,我会尝试运行它们。我收到以下错误。

name_of_file: command not found
file_extension: command not found
[: missing `]'
[: missing `]' 

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

首先,shell处理器处理行:

name_of_file = ${line%.*}

执行命令:

name_of_file

参数:

= ${line%.*}

你需要把它写成:

name_of_file=${line%.*}

这使它成为一个变量=值。您还需要为file_extension =行重复此操作。

其次,if:

if [ $file_extension == "php"]

具有完全相同的解析问题,你必须在尾随之前有空格],因为否则解析器认为你正在检查$ file_extension是否等于字符串:“php]”< / p>

if [ $file_extension == "php" ]

答案 1 :(得分:1)

首先删除空格,也许这会有所帮助...

name_of_file=${line%.*}
file_extension=${line##*.}

修改
试试这个:

if [ $file_extension="php" ]
..
if [ $file_extension="java" ]

答案 2 :(得分:1)

other answers是正确的,您的脚本中的问题位于变量赋值和[ .. ]语句中的杂散空间中。

(偏离主题.FYI)

我冒昧地重构你的剧本(未经测试!)只是为了突出一些替代方案,即:

  • 使用pgrep代替ps aux | grep .....
  • 使用case

-

#!/bin/bash
line="$@" # get the complete first line which is the complete script path 
name_of_file=${line%.*}

pgrep "$line" > /dev/null && exit # exit if process running

case "${line##*.}" in # check file extension
    php)
        nohup php -f "$line" > /var/log/iphorex/$name_of_file.log &
        ;;
    java)
        nohup java -f "$name_of_file" > /var/log/iphorex/$name_of_file.log &
        ;;
esac