2011-03-11 232 views
0

我有這樣的shell腳本。shell腳本錯誤

line="[email protected]" # 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 `]' 

任何想法?

+0

您需要的緊密報價'間空隙的支架問題「'和括號''''如下所示...''php」]' – 2011-03-11 13:57:34

+0

什麼shell?腳本是否以'#!'開頭? – nmichaels 2011-03-11 13:58:12

+0

然後我得到'name_of_file:找不到命令 FILE_EXTENSION:找不到命令 [:==:一元運算符預期 [:==:一元運算符expected' – ayush 2011-03-11 13:59:05

回答

3

首先,外殼處理器對待行:

name_of_file = ${line%.*} 

作爲執行者命令和灰:

name_of_file 

與參數:

= ${line%.*} 

你需要把它寫成:

name_of_file=${line%.*} 

這使得它成爲一個變量=值。您還需要爲file_extension =行重複此操作。

其次,如果:

if [ $file_extension == "php"] 

具有完全相同的分析問題,你必須的空間尾隨前],否則解析器認爲你檢查是否$ FILE_EXTENSION等於字符串:「PHP]」

if [ $file_extension == "php" ] 
1

先刪除空間,也許這將幫助...

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

編輯
試試這個:

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

no help'name_of_file:command not found infinity.sh:line 8:file_extension:command not found infinity.sh:line 9:[:==:unary operator expected infinity.sh:line 13:[: ==:一元運算符預期 '我得到了這個錯誤 – ayush 2011-03-11 14:01:53

1

other answers是正確的,在你的腳本問題出在流浪的空間在您的變量賦值和[ .. ]語句。

(題外話僅供參考。)

我把重構你的腳本(未經測試的自由!)只是爲了突出一些替代方案,即:

  • 使用case

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

  • -

    #!/bin/bash 
    line="[email protected]" # 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 
    
  • +0

    @Chin:感謝額外的東西..看起來更乾淨這種方式:) – ayush 2011-03-11 21:39:26

    +0

    不客氣。 – 2011-03-11 22:33:54