2017-08-17 6 views
1

また、私はLearning the bash Shell, 3rd Editionを第7章の「ユーザー入力を読む」セクションで読んでいます。私は以下のコードを参照してください すると、set - $DIR_STACKの正確な意味は

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 

は何ですか?など

+0

これはコマンドによって異なります。問題のコマンドのマニュアルページを読むことをお勧めします。 'set'コマンドについては、内部コマンドであるので、[Bashのマニュアルページ](http://man7.org/linux/man-pages/man1/bash.1.html)を読む必要があります。 –

+1

ほとんどのバグは 'set - $ DIR_STACK'を実行したかったのです。それは*それ自体*本当に悪い習慣です。 (そのため、全体として$ DIR_STACK'には 'direc 'があります)。 –

+0

...つまり、私は強く**あなたがより良い本を見つけることをアドバイスします。良い参考文献(良い習慣を気にする人が書いている)は、文字列分割を使ってイテラブル、特にファイル名を生成するのを奨励するものではありません。 –

答えて

2

この意志文字列分割と$1に最初に入れて、$DIR_STACKの内容をグロブ展開し、$2第二、それは良い習慣ではありません - よく書かれたスクリプト(参照文字列の分割に依存しませんBashPitfallsの最上部にあるアドバイスと、以下のバグの多くは、そのアドバイスに耳を傾けていないことが原因です。

--で正しく書かれていて、-ではありません。これは、POSIX Utility Syntax Guidelinesによって定義され、エントリ#10:

オプション引数は、オプションの終わりを示す区切り文字として受け入れられるべきではない最初の引数--。次の引数は、たとえ-文字で始まっていても、オペランドとして扱う必要があります。

残りの引数:(再び)標準ではない、---指定かかわら


(など$1$2、)引数リストを変更するにはsetの使用は、またspecified by POSIXです[ed:処理オプション後]は、位置パラメータに順番に割り当てる必要があります。特殊パラメータ#は、位置パラメータの数を反映するように設定されなければならない。新しい値が割り当てられる前に、すべての位置パラメータは設定解除されます。

すぐにsetコマンド名は、最初の引数は+または-で始まる場合は、引数を区切るために、または引数がないときに、すべてのシェル変数の不注意リストを予防するために使用することができ、以下の特別な引数--。引数なしのコマンドset --は、すべての位置パラメータを設定解除し、特殊パラメータ#をゼロに設定します。

関連する問題