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


91

一部のバックラッシュを見逃したか、バックラッシュがプログラマー引用符のループが多すぎても機能しないようです。

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

hello1-hello2-hello3-echo hello4

欲しかった

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

質問はおそらく「Bashのバッククォートを再帰的に使用する方法」を読んでください。それはそこにいるGooglerを助けるはずです。
ジョーイアダムス

あなたがやろうとしていることは何ですか?これはまったく意味がありません。
ghostdog74 2010

1
@joey、タイトル変更、歓迎:D
Stormenet

1
エラーが発生しました。「bashでバックティックをネストするにはどうすればよいですか?」。再帰とネストが混同されました。
ジョーイアダムス

バックティックはなのでdeprecated、使用します$(cmd)
ティモ

回答:


144

$(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

{1..10}のような+1。配列で制限しますか?ZSHは「$ {$(date)[2,4]}」を実行できます。なぜ「エコー$ {echo hello1-$(echo hello2)[1]}」ですか?
hhh

35

バックティックの使用を主張する場合は、次のようにすることができます

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

あなたはバックスラッシュ\\ \\\\ \\\\\\\\を2倍にする必要があります、など、それは非常に醜いです、$(commands)他の提案どおりに使用してください。


11

コマンドを評価したいときはいつでもcommand substitution

$(command)

算術式を評価したいときはいつでもexpression substitution

$((expr))

これらは次のようにネストできます:

次のような式を評価するよりも、file1.txtが30行、file2.txtが10行であるとします。

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

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


10

入れ子にしておくほうがずっとフレンドリーなbashの$(cmd) コマンド置換構文を使用すると、はるかに簡単になります。

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

5
これはbashに限定されません。これは、POSIX 1003.1(「POSIXシェル」)に準拠するすべてのシェルで利用可能で、ほとんどのBourne派生シェル(kshのダッシュbashのzshのけれども実際のBourneシェル(すなわちない、など)heirloom.sourceforge.net /sh.html)。
Chris Johnsen、2010

うわー、この回答のタイムスタンプは@joey_adams回答のタイムスタンプと同じです!ここでの同期は最も文字通りの意味です:)ここでも賛成投票(:
drevicko

0

時々、バックティックネストはxargsandパイプで置き換えることができます

$ 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.