引用符は「単語分割」を防ぎます。つまり、変数を空白文字(または、より正確には、スペース、タブ、およびデフォルトの$IFS
シェル変数の値で定義されている改行)で複数の項目に分解します。
例えば、
$ var="one two"
$ howmany(){ echo $#; }
$ howmany $var
2
$ howmany "$var"
1
ここで、howmany
与えられた位置パラメータの数を知るだけの関数を定義します。ご覧のとおり、変数に渡される項目は2つあり、引用符を使用すると、変数内のテキストは1つのユニットとして扱われます。
これは、情報を正確に渡すために重要です。たとえば、変数にファイルへのパスが含まれており、ファイル名にパスのどこかにスペースが含まれている場合、実行しようとしているコマンドが失敗したり、不正確な結果になることがあります。$var
変数を使用してファイルを作成しようとした場合、touch $var
2つのファイルが作成されますが、touch "$var"
1つだけです。
同じことがあなたにも当てはまります[ "$currentoutput" != "$lastoutput" ]
。この特定のテストは、2つの文字列で比較を実行します。テストを実行すると、[
コマンドは3つの引数(テキスト文字列、!=
演算子、および別のテキスト文字列)を見る必要があります。二重引用符を保持すると、単語の分割が防止され、[
コマンドはこれら3つの引数を正確に認識します。変数が引用されていない場合、どうなりますか?
$ var="hello world"
$ foo="hi world"
$ [ $var != $foo ]
bash: [: too many arguments
$
ここでは、単語の分割が発生し、代わりに[
2つの文字列が表示されますhello
と、world
続く!=
、他の二つの文字列が続きますhi world
。重要な点は、二重引用符がないと、変数の内容が1つのアイテム全体ではなく、個別のユニットとして理解されることです。
コマンド置換の割り当てには、二重引用符は必要ありません。
var=$( df )
あなたが持っているどこdf
コマンドの出力を保存しますvar
。ただし、$(...)
実際に出力を個別のアイテムとして処理する場合を除き、変数とコマンド置換を常に二重引用符で囲むことをお勧めします。
サイドノートでは、
while [ true ]
一部はすることができます
while true
[
引数を評価するコマンドであり、[ whatever ]
中身に関係なく常に真です。対照的に、常に成功終了ステータスを返すwhile true
コマンドtrue
を使用します(それがまさにそれですwhile
ループに必要なものです)。違いは、もう少し明確で、実行されるテストが少ないことです。また、:
代わりに使用することもできますtrue
の二重引用符 echo "" date and Time
一部はおそらく削除できます。空の文字列を挿入し、出力に余分なスペースを追加するだけです。それが必要な場合は、それらを自由に保管してください。ただし、この場合には特定の機能的価値はありません。
lsusb >> test.log
この部分はおそらくに置き換えることができecho "$currentoutput" >> test.log
ます。でlsusb
既に実行された後、再度実行する理由はありませんcurrentoutput=$(lsusb)
。末尾の改行がある場合
出力を保持する必要がある場合-コマンドを複数回実行することで値を確認できますlsusb
が、その必要はありません。外部コマンドの呼び出しが少ないほど、非組み込みコマンドの呼び出しごとにCPU、メモリ使用量、および実行時間のコストが発生するため(コマンドはおそらくメモリからプリロードされます)、より適切です。
こちらもご覧ください:
while [ true ]
が無限ループを生成することに注意してください。ただし、おそらくあなたがそれを行うと考える理由のためではありません。while [ false ]
また、単一の引数で、[ ... ]
その引数が空でない文字列であれば成功するため、無限ループも生成します。という名前のコマンドwhile true
を実際に実行しますtrue
(常に成功します)。