シェルスクリプトのパターンマッチングサフィックスとプレフィックス

シェルスクリプトのパターンマッチングサフィックスとプレフィックス

この変数がありますが、プレフィックスとサフィックスを削除したいと思います。

var="abcde"
echo "${${var#a}%e}" 

私はzshでこの作品を試してみましたが、うまくいきました。返しますbcd。パターンマッチ(プレフィックスとサフィックス)を使用します。しかし、posix準拠のシェルスクリプトで実行した場合(bash文字列操作の代わりにパターンマッチングを使用する理由)、出力はbad substitution

どうしたの?保存する別の変数を作成する必要がありますか"${var#a}"、それとも1行で完了できますか?私はposix互換スクリプトが欲しい。

答え1

いいえ、他の変数は必要ありません。はい、1行にすることができます。

これはおそらく最も移植可能な解決策ですが、変数の値を上書きします(まだ質問に記載されている単一の変数を使用します)。これはシェル言語のパラメータ拡張のみを使用します。

var="abcde"
var="${var#a}" # remove prefix
echo "${var%e}" # remove suffix

1行のコード生成は常に次のようになります。

var="abcde"; var="${var#a}"; echo "${var%e}"

変数を上書きしたくない場合、関数パラメータは完全な一時変数です。例は簡単ですが、使用されている追加の変数を隠す関数を作成できます。このアプローチは、POSIX シェルにローカル変数がないため、特に便利です。

# this function runs in a subshell, so all new variables are lost on the return
remove_pre_post() (
    local_var="${1#a}" # uses the first argument
    echo "${local_var%e}"
)

var="abcde"
remove_pre_post "$var" # call function

別のPOSIX互換ソリューションには、次のものが含まれますsed

var="abcde"
echo "$var" | sed 's/^a//; s/e$//'

パターンマッチなしで例だけを提供しました。パターンマッチングが重要になると、パターンの複雑さに応じて、ある解決策が他の解決策よりも優れているように見えることに注意してください。

関連情報