2013-04-18 122 views
1

我該如何解決這個錯誤?我的語法看不到任何錯誤。意外`然後'bash腳本

ipcheck() { 
    echolog "[INFO] Enabling IP Forwarding..." 
    sudo echo 1 > /proc/sys/net/ipv4/ip_forward 
    if[$(cat /proc/sys/net/ipv4/ip_forward) == "0"] 
    then 
    echolog "[CRITICAL] Could not enable IP Forwarding!" 
    exit 0 
    fi 
    echolog "[INFO] IP Forwarding successfully enabled!" 
} 

我知道這是一個非常基本的腳本,但它是一個更大的腳本的一部分。該錯誤發生在then語句中。

+0

bash提示:使用'$(<文件名)'而不是'$(貓文件名)' - f ormer是內建結構。 –

回答

5

如果您是來自其他編程語言(參見:C),那麼Shell腳本會比您使用的空白敏感更多。您的if行存在問題。您可能正在尋找:

if [ $(cat /proc/sys/net/ipv4/ip_forward) == "0" ] 

這裏要記住的一點是,[沒有任何特殊if語法的一部分 - 這是一個程序(有時是shell內建)的名稱。如果你這樣想,你可以看到命令行解析器需要如何分離它。同樣,[命令(或內置)期望結束]與其他參數分開,所以您也需要一個空格。

+0

非常感謝,我無法想象這是解決方案。你猜對了我是從C出來的。 – joaop

2

問題是您需要在if[之間的空格。缺乏空間是令人困惑的bash解析器。

+0

還有''''''之前''''之後需要有空格*。 –

+0

沒錯,雖然它沒有解析,只是沒有運行。 – Steve

+1

我很確定OP會回來,「我的腳本不起作用,它說'[$(cat ...」:command not found'「)。 –

2

在第4行的if[$(cat...]部分之間放一個空格。要運行此腳本,同一行上的]上還需要一個空格。

在相關說明中,如果您在shell腳本中未使用縮進,則應認真考慮它,因爲它會使代碼的維護和易讀性變得更容易。

0

稍微重構(改善)版是 bash的依賴:

#!/bin/sh 

ipcheck() { 
    echolog "[INFO] Enabling IP Forwarding..." 
    sudo echo 1 > /proc/sys/net/ipv4/ip_forward || { 
     echolog "[CRITICAL] Error echoing to ip_forward file" 
     exit 1 
    } 

    # Paranoia check :) 
    status=$(cat /proc/sys/net/ipv4/ip_forward) 
    [ "$status" = "1" ] || { 
     echolog "[CRITICAL] Could not enable IP Forwarding!" 
     exit 1 # 1 is error in scripts, 0 is success 
    } 
    echolog "[INFO] IP Forwarding successfully enabled!" 
} 

最好做一個error()功能,也許是這樣的:

# Call it like: error "[INFO] Could not ..." 
error() { 
    echolog "$*" 
    exit 1 
} 

哦,是的,正如其他人指出出來,不要忘記空間:)

相關問題