バッシュバックティックを適切にネストする方法
質問
バックラッシュやバックラッシングを見逃したか、プログラマークオートループがあまりにも多く動作しないようです。
$ echo "hello1-`echo hello2-\`echo hello3-\`echo hello4\`\``"
hello1-hello2-hello3-echo hello4
欲しかった
hello1-hello2-hello3-hello4-hello5-hello6-...
解決
使用する $(commands)
代わりは:
$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
$(commands)
バックティックと同じことをしますが、それらをネストすることができます。
また、バッシュレンジの拡張にも興味があるかもしれません。
echo hello{1..10}
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10
他のヒント
バックテックを使用することを主張する場合、フォローを行うことができます
$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"
あなたはバックスラッシュを置かなければなりません、 \\ \\\\ \\\\\\\\
2xなどで、非常に醜い、使用 $(commands)
他の人が示唆したように。
コマンドの使用を評価したいときはいつでも command substitution
:
$(command)
算術式の使用を評価したいときはいつでも expression substitution
:
$((expr))
あなたはこれらをこのようにネストすることができます:
file1.txtの長さは30行で、File2.txtの長さは10行で、次のような式を評価できます。
$(( $(wc -l file1.txt) - $(wc -l file2.txt) ))
これは20(2つのファイル間の行数の差)を出力します。
Bash'sを使用すればずっと簡単です $(cmd)
コマンド置換構文, 、これはネストされるよりもはるかに友好的です:
$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4
バックティックのネストを置き換えることがあります 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
所属していません StackOverflow