#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}"
これらの2つの線を1つのライナーに接着する方法はありますか?
回答
FILE=$(basename "${1/%.jpeg/.jpg}")
は私のために働きました。
テスト:
bash-$ ./test.sh /tmp/foo.jpeg foo.jpg
スクリプトの内容:
bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE"
コメント
回答
ネストできませんbashでの展開(zsh以外のksh、ash、その他のシェルでも)これは見た目の制限にすぎません。これは、説明したように、中間式を一時変数に割り当てることができるためです。ワンライナーにとっては少し面倒ですが、スクリプトでは、読みやすさの点で間違いなく優れています。
uを回避できます。外部ユーティリティbasename
を歌い、代わりに文字列操作構造を使用します:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
ここで、次のことができるようになります。スクリプトをコマンド置換を外側に配置するように書き直します。これは一般的な現象ではなく、特定のワンライナー感以外のものも得られません。
Zshは、良くも悪くも、拡張をネストできます:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
または、basename
の代わりにzshの組み込み構造を使用することもできます:
FILE=${${1:t}/%.jpeg/.jpg}
回答
行きます:
FILE=$(basename $1 .jpeg).jpg
basenameの2番目のパラメーターは、ファイル名から削除されるサフィックスです(man basename
を参照)
回答
次のように、単一のsed
コマンドを使用できます。
FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1")
回答
sed
を組み込むと、次のトリックが実行されます。
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(これは、私ができないため、あなたの質問に正確に答えることはできません。それが可能かどうかはわかりません。)
回答
バッシュコンストラクトは変数名で機能するため、コマンドを直接埋め込む方法はありません。 @sr_のアプローチは、余分なフォークを気にしない場合の代替手段です。
回答
行
FILE=$(basename "${1/%.jpeg/.jpg}")
を使用すると、短縮して移植性を高めることができます
FILE=$(basename "${1%.jpeg}.jpg")
sed
は間違いなく必要になると思います。