Bash 置換項目を関数引数として提供

Bash 置換項目を関数引数として提供

うまく動作する次のループがあります。

function uppercase_all_letters() {
  for filename in *;
    do echo "${filename^^}";
  done;
}

"${filename^^}"関数にパラメータとして提供する方法は?

SUBSTITUTION="${filename^^}"いつものように()を試しましたが、Bashは次のように報告しました。

./test.sh: line 26: ${filename^^}: bad substitution

答え1

文字通りこれを行うには、evalに依存する必要があるかもしれません。

function subst_all_filenames() {
    subst="$1"
    for filename in *
    do
        eval 'echo ${filename'"$subst"'}'
    done
}

subst_all_filenames "^^"
subst_all_filenames ",,"
subst_all_filenames ""

または、既知の代替リストのみがサポートされています。

function subst_all_filenames() {
    case "$1" in
      ^^) for filename in *; do echo "${filename^^}"; done ;;
      ,,) for filename in *; do echo "${filename,,}"; done ;;
       *) printf "%s\n" * ;;
    esac
}

時にはそのようなヘルパー機能が必要ない場合もあります。シェルスクリプトのどこにもこのようなループがあるのは正常です。

関連情報