#!/bin/bash
FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"
この2行を1行にまとめる方法はありますか?
答え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"
答え2
bash(ksh、ash、zshを除く他のシェル)には拡張子を入れ子にすることはできません。前述のように、中間式を一時変数に割り当てることができるため、これは表面的な制限にすぎません。これは1行のテキストでは少し迷惑ですが、スクリプトでは読みやすくなります。
外部ユーティリティの使用を避け、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}
答え3
私は以下を選択します:
FILE=$(basename "$1" .jpeg).jpg
basenameの2番目の引数は、ファイル名から削除するサフィックスです(参照man basename
)。
答え4
Merged sed
、これはトリックを実行する必要があります:
FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"
(あなたの質問に正確に答えることはできません。可能であるかどうかわからないからです。)