回答:
bashで(zsh以外のksh、ash、その他のシェルで)拡張をネストすることはできません。これは表面的な制限にすぎません。説明するように、中間式を一時変数に割り当てることができるからです。ワンライナーには少し面倒ですが、スクリプトでは読みやすさの点で間違いなく優れています。
外部ユーティリティの使用を避け、basename
代わりに文字列操作構成体を使用できます。
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
ここでは、スクリプトを書き直して、コマンド置換を外側に置くことができます。それは一般的な現象ではなく、特定のワンライナー感以外のものも得られません。
Zshは、良くも悪くも、拡張をネストすることができます。
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
または、次の代わりにzshの組み込み構造を使用することもできますbasename
。
FILE=${${1:t}/%.jpeg/.jpg}
この線
FILE=$(basename "${1/%.jpeg/.jpg}")
短縮してよりポータブルにすることができます
FILE=$(basename "${1%.jpeg}.jpg")
sed
間違いなく必要になると思います。