是否有用於bash腳本的所有if
開關的列表?有時候我看到有人在使用它,我不知道他們使用的開關實際上是在做什麼。任何地方的'if'開關列表?
例子是-z
在這一個。我知道如何使用它,但我不知道它來自哪裏。
if [ -z "$BASH_VERSION" ]; then
echo -e "Error: this script requires the BASH shell!"
exit 1
fi
任何參考,指南,職位,答案將不勝感激。
是否有用於bash腳本的所有if
開關的列表?有時候我看到有人在使用它,我不知道他們使用的開關實際上是在做什麼。任何地方的'if'開關列表?
例子是-z
在這一個。我知道如何使用它,但我不知道它來自哪裏。
if [ -z "$BASH_VERSION" ]; then
echo -e "Error: this script requires the BASH shell!"
exit 1
fi
任何參考,指南,職位,答案將不勝感激。
看看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 `['.
聯機手冊:[Bash Conditional Expressions](http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions。html) –
它實際上不是if
這是提供那些 - 這是[
,更好地名稱爲test
。 help test
應該給你一個它可以採取的所有選項的列表。如果你在意,你也可以看看the standard。
-1:測試既是命令'/ bin/test'和bash內建。 'man test'爲你提供命令的文檔,但'['是內建的同義詞。作爲發散行爲的例子,在OSX上,bash內建支持'-N'測試,但是'/ bin/test'不支持 – SheetJS
他們不是爲if
聲明開關,但對於test
命令([
對於test
內置的代名詞)。請參閱bash中的help test
以獲取完整列表。
是的。這些被稱爲conditional expressions並且這些被[[
compound command和test
和[
builtin commands([
僅僅是test
的同義詞)所使用。
閱讀Bash Reference Manual的6.4 Bash Conditional Expressions部分,其中包含所有這些交換機及其用法的列表。
單頁:[6.4 Bash Conditional Expressions](http://www.gnu.org/)軟件/ bash/manual/html_node/Bash-Conditional-Expressions.html) –
單一方括號([ ... ]
)是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
語句執行該命令,然後根據該命令的退出狀態執行if
或else
子句。如果你想測試一個文件是否存在,你應該使用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/[
。然而,他們仍然彼此連接。
'''不是測試的別名。同義詞是手冊頁使用的詞。別名具有特定的含義(在bash的manpage中,請閱讀「ALIASES」部分) – SheetJS
好的。我會改變這一點。我只是在尋找一個能夠解釋兩者如何相互關聯的詞。 –
http://www.gnu.org/software/bash/manual/bashref.html –
'''''test'命令的簡稱。嘗試'人測試'。 – Barmar
@Barmar你的意思是'幫助測試'。 'man test'是'/ bin/test'的文檔,它支持'test'內建的不同選項 – SheetJS