ドル記号とは何か分かりません。特にこの文脈では:
for url in $(cat example.txt); do host $url;
答え1
バッシュリファレンスマニュアル バッシュマニュアル
3.2.4.3 グループ化コマンド
Bash は、実行するコマンドのリストを 1 つの単位にグループ化する 2 つの方法を提供します。命令をグループ化すると、命令の全リストにリダイレクトを適用できます。たとえば、リスト内のすべてのコマンドの出力を単一のストリームにリダイレクトできます。
()
( list )
括弧内にコマンドリストを配置すると、サブシェル環境(コマンド実行環境を参照)が生成され、リスト内の各コマンドがサブシェルで実行されます。リストはサブシェルで実行されるため、サブシェルが完了した後に変数の割り当てが無効になります。
これは以下とは異なります
$
。
3.5.4 コマンドの置換
コマンド置換を使用すると、コマンド出力がコマンド自体を置き換えることができます。コマンド置換は、コマンドが次のように括弧で囲まれている場合に発生します。
$(command)
3.2.4.1 ループ構造
for
for コマンドの構文は次のとおりです。
for name [ [in [words …] ] ; ] do commands; done
単語を展開し、現在のメンバーにバインドされている名前を使用して、結果リストの各メンバーに対してコマンドを1回ずつ実行します。 'in Words'がない場合、forコマンドは 'in "$@"'が指定されているように設定された各位置引数に対して1回実行されます(特殊パラメータを参照)。戻り状態は、最後に実行されたコマンドの終了状態です。拡張という単語にエントリがない場合、コマンドは実行されず、戻り状態はゼロです。
example.txt に次のコンテンツが含まれているとします。
www.google.com
www.youtube.com
www.facebook.com
あなたのコマンドは次のことを行います。
url=www.google.com
host www.google.com
url=www.youtube.com
host www.youtube.com
url=www.facebook.com
host www.facebook.com
host
URL の IP アドレスを返すコマンドです。
答え2
それはコマンドの置き換え通事論。角かっこ内のコマンドをインポートして実行し、そのコマンドの出力(標準出力)をインポートしてコマンド文字列の対応する部分に置き換えます。この例では、それに依存するトリッキーな部分は2つあります。
- 引用されていないため、結果はファイル名拡張の影響を受けます。したがって、example.txtの一部に既存のファイル名と一致するパターンが含まれている場合は、パターン/文字列の代わりにそのファイル名を取得します。
- $ IFS変数に基づいて結果を単語に分割します。 example.txt に「a filename.txt」などのファイル名が含まれている場合、外部
for
ループは二つパラメータ -a
おそらくfilename.txt
間違ったことをするかもしれません。
この例は、人々がファイル名パターンやスペース(またはタブ)を含めないようにexample.txtの内容に依存しているため、よく見られます。
このオネライナの結果は、example.txtで想定されているドメイン名を繰り返してDNSルックアップを実行することです。
答え3
bash
コードを理解するには、-x
オプションの設定が非常に役立つことがよくあります。
set -x # within a script / function
またはスクリプトを呼び出すとき:
bash -vx ./script.sh
これはループにはあまり役に立ちません。ただし、いつでもコマンドの最初の部分を使用して次のことを実行できます。
echo for url in $(cat example.txt)
これはそこで何が起こっているのかを示しています(少なくとも結果は)。
この機能を「コマンド置換」といいます。これは$(...)
コマンドの出力に置き換えられます(末尾の改行なし)。
bash -n ./script.sh
構文エラーが表示されます。done
コードの最後に何が欠けているかを指摘します。