Bash - 連続文字列操作

Bash - 連続文字列操作
#!/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/)"

(あなたの質問に正確に答えることはできません。可能であるかどうかわからないからです。)

関連情報