2013-09-29 61 views
13

是否有用於bash腳本的所有if開關的列表?有時候我看到有人在使用它,我不知道他們使用的開關實際上是在做什麼。任何地方的'if'開關列表?

例子是-z在這一個。我知道如何使用它,但我不知道它來自哪裏。

if [ -z "$BASH_VERSION" ]; then 
    echo -e "Error: this script requires the BASH shell!" 
    exit 1 
fi 

任何參考,指南,職位,答案將不勝感激。

+0

http://www.gnu.org/software/bash/manual/bashref.html –

+0

'''''test'命令的簡稱。嘗試'人測試'。 – Barmar

+0

@Barmar你的意思是'幫助測試'。 'man test'是'/ bin/test'的文檔,它支持'test'內建的不同選項 – SheetJS

回答

18

看看bash的聯機手冊(man bash)。該選項在CONDITIONAL EXPRESSIONS部分指定:

CONDITIONAL EXPRESSIONS 
     Conditional expressions are used by the [[ compound command and the 
     test and [ builtin commands to test file attributes and perform string 
     and arithmetic comparisons. Expressions are formed from the following 
     unary or binary primaries. If any file argument to one of the pri- 
     maries is of the form /dev/fd/n, then file descriptor n is checked. If 
     the file argument to one of the primaries is one of /dev/stdin, 
     /dev/stdout, or /dev/stderr, file descriptor 0, 1, or 2, respectively, 
     is checked. 

     Unless otherwise specified, primaries that operate on files follow sym- 
     bolic links and operate on the target of the link, rather than the link 
     itself. 

     -a file 
       True if file exists. 
     ... more options ... 

它在幫助還解釋:

$ help [ [: [ arg... ] 
    This is a synonym for the "test" builtin, but the last 
    argument must be a literal `]', to match the opening `['. 
+6

聯機手冊:[Bash Conditional Expressions](http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions。html) –

2

它實際上不是if這是提供那些 - 這是[,更好地名稱爲testhelp test應該給你一個它可以採取的所有選項的列表。如果你在意,你也可以看看the standard

+1

-1:測試既是命令'/ bin/test'和bash內建。 'man test'爲你提供命令的文檔,但'['是內建的同義詞。作爲發散行爲的例子,在OSX上,bash內建支持'-N'測試,但是'/ bin/test'不支持 – SheetJS

3

他們不是爲if聲明開關,但對於test命令([對於test內置的代名詞)。請參閱bash中的help test以獲取完整列表。

2

單一方括號([ ... ])是test命令的同義詞。如果你看看manpage for test,你會看到幾乎所有的(BASH可能有一些額外的未在此提及)各種,如果開關如你所說。在一個容易找到的地方。

如果使用雙方括號([[ ... ]]),則使用擴展的BASH測試集。這些主要涉及正則表達式匹配和全局匹配(如果您也有設置,也可以使用擴展的全局匹配)。爲此,您必須閱讀BASH手冊頁。

如果開關您稱他們爲,但這不是真的正確。這些是測試並且與if命令確實無關。

if命令只是執行你給它的命令,然後如果該命令返回的0退出代碼,將運行if語句的if部分。否則,它將運行else部分(如果存在的話)。

讓我們看看這個:

$ rm foo.test.txt # Hope this wasn't an important file 
$ if ls foo.test.txt 
> then 
> echo "This file exists" 
> else 
> echo "I can't find it anywhere.." 
> fi 
ls: foo.test.txt: No such file or directory 
I can't find it anywhere.. 

if語句運行ls foo.test.txt命令,因爲該文件不存在ls命令返回一個非零。這會導致if語句執行else子句。

讓我們一遍試試......

$ touch foo.test.txt # Now this file exists. 
$ if ls foo.test.txt # Same "if/else" statement as above 
> then 
> echo "This file exists" 
> else 
> echo "I can't find it anywhere.." 
> fi 
foo.test.txt 
This file exists 

這裏,ls命令返回的0退出狀態(因爲該文件存在並且該文件存在,並且可以通過ls命令stat'ed。

通常情況下,您不應該使用ls命令來測試文件,我在此僅用它來表示if語句執行該命令,然後根據該命令的退出狀態執行ifelse子句。如果你想測試一個文件是否存在,你應該使用test -e命令,而不是ls命令:

if test -e foo.test.txt # Same as above, but using "test" instead of "ls" 
then 
    echo "This file exists" 
else 
    echo "I can't find it anywhere.." 
fi 

如果該文件存在,test -e將返回0退出狀態。否則,它將返回一個非零退出狀態。

如果你這樣做:

$ ls -i /bin/test /bin/[ 
10958 /bin/[ 10958 /bin/test 

10958的inode。具有相同inode的文件是同一文件的兩個不同名稱。因此[test命令是軟鏈接的。這意味着你可以使用[代替test

if [ -e foo.test.txt ] 
then 
    echo "This file exists" 
else 
    echo "I can't find it anywhere.." 
fi 

看起來很熟悉?


1.在bash中test[是內置的,所以當你在BASH運行這些命令,它沒有運行/bin/test/bin/[。然而,他們仍然彼此連接

+0

'''不是測試的別名。同義詞是手冊頁使用的詞。別名具有特定的含義(在bash的manpage中,請閱讀「ALIASES」部分) – SheetJS

+0

好的。我會改變這一點。我只是在尋找一個能夠解釋兩者如何相互關聯的詞。 –