web-dev-qa-db-ja.com

Bashバックティックを適切にネストする方法

バックラッシュを逃したか、プログラマークォートループが多すぎるとバックラッシュが機能しないようです。

$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``"

hello1-hello2-hello3-echo hello4

希望

hello1-hello2-hello3-hello4-hello5-hello6-...
77
hhh

代わりに$(commands)を使用してください:

_$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
_

$(commands)はバックティックと同じことを行いますが、ネストすることができます。

Bashの範囲拡張にも興味があるかもしれません:

_echo hello{1..10}
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10
_
129
Joey Adams

バックティックを使用することを主張する場合、以下を行うことができます

_$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"
_

バックスラッシュ、_\\ \\\\ \\\\\\\\_を2倍にするなど、非常にいので、他の推奨事項として$(commands)を使用する必要があります。

32
YOU

コマンドを評価したいときはいつでもcommand substitutionを使用してください:

$(command)

算術式を評価したいときはいつでもexpression substitutionを使用してください:

$((expr))

これらを次のようにネストできます。

File1.txtの長さは30行、file2.txtの長さは10行とすると、次のような式を評価できます。

$(( $(wc -l file1.txt) - $(wc -l file2.txt) ))

20(2つのファイル間の行数の差)を出力します。

10
toobsco42

Bashの$(cmd)コマンド置換構文 を使用すると、はるかに簡単になります。

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
9
Mark Rushakoff

バックティックのネストはxargsとパイプで置き換えることができる場合があります

$ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1
hello1 hello2 hello3 hello4

このソリューションの欠点は次のとおりです。

  • すべての引数は逆順(4→1)で提供する必要があります。
  • すべての引数はスペースで区切られます(trで解決可能):

    $ echo hello4 | xargs echo hello3 | xargs echo hello2 | xargs echo hello1 | tr ' ' '-'
    hello1-hello2-hello3-hello4
    

次のコマンドはbashで機能しますが、tcshでは機能しません(tcshではバックティックのネストはあまり適切に処理されません)

$ ls $(dirname $(which bash))
$ ls `dirname \`which bash\``

で置き換えることができます

$ which bash | xargs dirname | xargs ls
0
G. C.