Bash - ${##}を使用してコマンド結果から部分文字列を削除できますか?

Bash - ${##}を使用してコマンド結果から部分文字列を削除できますか?

私はこれが私にgitの現在のブランチの名前を与えると思います。

echo "${`git symbolic-ref HEAD`##refs/heads}"

しかし、これにより

-bash: ${`git symbolic-ref HEAD`##refs/heads}: bad substitution

結果を中間変数に保存せずに、1行のコマンド結果に##を使用できますか?それとも別の方法(例:?)を使用する必要がありますかsed

ベストアンサー1

いいえbash。ただし、次のことができますzsh

printf '%s\n' "${$(git symbolic-ref HEAD)#refs/heads}"

そこで働きます。

または、いつでも次を使用してストリッピングを実行できますsed

printf '%s\n' "$(git symbolic-ref HEAD | sed '1s|^refs/heads||')"

削除する部分に改行文字が含まれていると、状況はさらに複雑になります。たとえば、削除する部分がある場合は、$'1\n2\n3\n'次のようなものが必要です。

cmd1 -- "$(cmd2 | sed '1{$!N;$!N;$!N; s/^1\n2\n3\n//;}')"

cmd2したがって、終了状態を維持するという利点を持つ一時変数を使用することもできます。

strip=$'1\n2\n3\n'

out=$(cmd2); cmd2_status=$?
cmd1 -- "${out#"$strip"}"

おすすめ記事