Bashコマンドラインに次のコードを入力してみてください。
$ echo $(( $(wc -l letter.txt | cut -c1-4)/66 + 1))
存在し、66 * 4行があると仮定すると、letter.txt
コマンドラインに文字列5が入力されます。今理解できないのは、コマンドライン処理について私が知っている知識に基づいて、この結論がどのように導かれたかです。
私の本(SobelLinux実用ガイド,4e) 言う
Bourne Again Shellは、さまざまな種類の拡張と置換のために、次の順序で各トークンをスキャンします。これらのプロセスのほとんどは、単語を単一の単語に拡張します。中括弧拡張、単語分割、およびパス名拡張のみコマンドの単語数を変更できます(変数「$ @」拡張除外 - 474ページを参照)。
- サポート拡張(次ページ)
- チルダ拡張(368ページ)
- パラメータと変数の拡張(368ページ)
- 算術拡張(369ページ)
- コマンドの置き換え(371ページ)
- 噴射(372ページ)
- パス名拡張(372ページ)
- プロセスの交換(374ページ)
- 見積もりの削除(374ページ)
上記によれば、算術拡張が最初に評価されるように見えます。そうであれば、トークンは$(wc -l letter.txt | cut -c1-4)
bashによって処理される整数算術の有効なオペランドではありません。脱出口は何ですか/理解できないものは何ですか?
答え1
あなたの本は完全に正確ではありません。man bash
具体的な手順については、以下を参照してください。
拡張順序は、中かっこ拡張、パラメータと変数拡張、算術拡張、コマンドの置換(左から右へ)です。
カンマの使用に注意してください。セミコロン。引数、変数、算術拡張、コマンド置換はすべて同じ順序で行われます。
マニュアルに記載されている演算拡張の説明は次のとおりです。
式のすべてのトークンは、パラメータと変数の拡張、コマンドの置き換え、および引用符の削除を受けます。
コマンドの置換は次のように説明されます。
...サブシェル環境でコマンドを実行する
これは、すべての拡張が内部から外部にネストされたときに発生することを意味します。
$ echo $((1 + $(echo $((2+$(printf %s 3))))))
6