2016-02-11 71 views
3

我有一個簡單的bash腳本:猛砸 '來源':近意外的標記語法錯誤',然後」

#!/bin/bash 

if [ -n "abcd" ]; then 
    echo "a non-empty string" 
else 
    echo "an empty string" 
fi 

腳本罰款運行:

$ bash test.sh 
non-empty string 

但是,當我嘗試它會產生一個奇怪的錯誤信息:

$ source test.sh 
bash: ./test.sh: line 3: syntax error near unexpected token `then' 
bash: ./test.sh: line 3: `if [ -n "abcd" ]; then 

任何意見的歡迎。包含if命令的任何腳本都會出現問題,其中包括Fedora的/etc/bashrc和其他腳本。如果命令包括沒有相應if關鍵字then殼關鍵字將發生

$ bash --version 
GNU bash, version 4.3.42(1)-release (x86_64-redhat-linux-gnu) 
+0

它運行良好:'GNU bash,版本4.2.53(1) - 發佈(i586-suse-linux-gnu)' –

+0

你目前的shell bash? 'echo $ SHELL' –

+0

@AnonyGeoghegan:你的'type -'解決了它。非常感謝你。我遇到的是:我做了一個別名'別名f = find。 -name'。現在看看工作中的白癡:我想爲'find找個別名。 -iname'。猜猜我選了什麼名字?幾天後,我使用它,並沒有意識到'如果'是一個關鍵字... –

回答

5

這樣的錯誤。

如果使用if這個詞來定義一個別名,別名在Bash解析您的命令之前會被展開,導致這樣的錯誤。這可以通過運行type -a if進行檢查。如果已經別名,你會看到類似下面的輸出

if is aliased to <some command> 
if is a shell keyword 

的問題,那麼可以通過運行unalias if刪除別名來解決。

當運行bash test.sh時,新shell是非交互式的,默認情況下,Bash僅擴展交互式shell的別名。運行source test.sh意味着文件中的命令在當前(交互式)shell中解釋,並且問題別名已擴展。

爲了將來的參考,如果在交互式shell中存在問題,但在非交互式shell中沒有問題,則值得運行alias來檢查哪些別名已被定義。

相關問題