2017-08-17 67 views
1

只讀,我在第7章「閱讀用戶輸入」一節中閱讀Learning the bash Shell, 3rd Edition。當我 請參見下面的代碼,

echo 'Select a directory:' 
done=false 

while [ $done = false ]; do 
     do=true 
     num=1 
     for direc in $DIR_STACK; do 
       echo $num) $direc 
       num=$((num+1)) 
     done 
     echo -n 'directory? ' 
     read REPLY 

     if [ $REPLY -lt $num ] && [ $REPLY -gt 0 ]; then 
       set - $DIR_STACK 

       #statements that manipulate the stack... 

       break 
     else 
       echo 'invalid selection.' 
     fi 
done 

什麼是set - $DIR_STACK的確切含義是什麼?

+0

這取決於命令。我建議閱讀有關命令的手冊頁。對於'set'命令,你必須閱讀[Bash手冊頁](http://man7.org/linux/man-pages/man1/bash.1.html),因爲它是一個內部命令。 –

+1

這幾乎肯定是一個錯誤,他們想要運行'set - $ DIR_STACK'。這本身就是一個非常糟糕的做法。 (就這一點而言,'整個DIR_STACK'也是這樣)。 –

+0

......這就是說,我**強烈建議你找一本更好的書。一個很好的參考(由關心良好實踐的人撰寫)不會鼓勵您使用字符串分割來生成迭代,特別是不是文件名。 –

回答

2

這將字符串分割和水珠,擴大內容的$DIR_STACK,將率先在$1,第二次在$2等,這不是好的做法 - 精心編寫的腳本不依賴於字符串分割(見在BashPitfalls最頂端的建議,以及下面的許多錯誤是由於沒有注意到該建議而引起的)。

--寫得更合適,而不是-。這是通過定義POSIX Utility Syntax Guidelines,條目#10:

第一--論點,即不是一個選項形式參數應該被接受爲指示選項的結束的定界符。以下任何參數都應視爲操作數,即使它們以-字符開頭。


採用set改變參數列表($1$2等)也specified by POSIX,雖然(再次)在標準規定--,不-

其餘的參數[編輯:處理選項後]應按位置參數進行分配。應該設置特殊參數#以反映位置參數的數量。在分配任何新值之前,所有位置參數都應該取消設置。

特殊參數--立即set命令名稱可使用以下來界定的參數,如果第一個參數與+-開始,或防止所有shell變量的意外上市時沒有參數。不帶參數的命令set --應取消設置所有位置參數,並將特殊參數#設置爲零。

相關問題