![while [ -n "$1" ]; 開始的迴圈何時開始執行?](https://rvso.com/image/146500/while%20%5B%20-n%20%22%241%22%20%5D%3B%20%E9%96%8B%E5%A7%8B%E7%9A%84%E8%BF%B4%E5%9C%88%E4%BD%95%E6%99%82%E9%96%8B%E5%A7%8B%E5%9F%B7%E8%A1%8C%EF%BC%9F.png)
我有一個以 while 循環開頭的 shell 腳本
while [ -n "$1" ]; do
我知道 that$1
指的是腳本名稱後面的參數,即firstargument
,當我執行時./myscript.sh firstargument
。是做什麼的-n
?
答案1
這-n
是對非空字串的測試。
如果"$1"
擴展為空字串,則該特定測試失敗且循環將不會執行。
這是可能循環體包含shift
將下一個位置參數移入的語句$1
,並以這種方式循環遍歷腳本的參數,直到找到空參數或到達參數列表的末端。
該test
實用程式相當於[
,但[
要求最後一個參數是]
。
測試也可以寫成
while test -n "$1"; do
[
和都test
可能內建在您的 shell 中,但也應該在標準路徑(如/bin
.
您將能夠在man test
以及 shell 手冊(因為它是內建實用程式)中閱讀有關此測試和其他測試的更多資訊。
此次-n
測試也是其中之一標準測試,因此也列出在test
實用程式的 POSIX 標準。
如果這個循環應該循環結束全部shell 腳本的參數,如果參數為空,則可能無法執行此操作:
$ sh -c 'while [ -n "$1" ]; do printf "arg: %s\n" "$1"; shift; done' sh 1 2 3 "" 4 5 6
arg: 1
arg: 2
arg: 3
相反,它應該使用類似的東西
for arg do
if [ -n "$arg" ]; then
# do something with "$arg"
fi
done
……顯然取決於腳本的作用。