web-dev-qa-db-ja.com

コマンドライン引数を大文字にする方法は?

私はSOを検索し、その後に続く文字列を大文字にするとうまくいくことがわかりました

str="Some string"
echo ${str^^}

しかし、私はコマンドライン引数で同様のことをしようとしました、それは私に次のエラーを与えました

試しました

#!/bin/bash
             ## Output
echo ${1^^}  ## line 3: ${1^^}: bad substitution
echo {$1^^}  ## No error, but output was still smaller case i.e. no effect

どうすればよいでしょうか?

134
mtk

構文str^^は、Bash 4.0以降で使用できます。おそらくあなたのバージョンは古いバージョンです(または明示的にshでスクリプトを実行しました):

これを試して:

str="Some string"
printf '%s\n' "$str" | awk '{ print toupper($0) }'
160
Guru
echo "lowercase" | tr a-z A-Z

出力:

LOWERCASE
96
Johner Ramirez

AからZまでしか使用しない場合を除き、trには注意してください。他のロケールでは、 '[:lower:]' '[:upper:]'が失敗しても、awkのtoupperとbash(v4 +)のみが機能します

$ str="abcåäö"
$ echo "$str"|tr '/a-z/' '/A-Z/'
ABCåäö
$ echo "$str"|LC_ALL=sv_SE tr '[:lower:]' '[:upper:]'
ABCåäö
$ echo "$str"|awk '{print toupper($0)}'
ABCÅÄÖ
$ echo ${str^^} # Bash 4.0 and later
ABCÅÄÖ
$ STR="ABCÅÄÖ"
$ echo ${STR,,}
abcåäö
25
lpaseen

あるいは、何十年も大文字小文字変換をサポートしているkshまたはzshに切り替えることもできます(4.0でbash${var^^}が追加されるずっと前)、構文は異なります。

#! /bin/ksh -
typeset -u upper="$1"
printf '%s\n' "$upper"

zshでも機能します。pdksh/ mkshではASCII文字でのみ機能することに注意してください)。

zshでは、Uパラメータ拡張フラグを使用することもできます。

#! /bin/zsh -
printf '%s\n' "${(U)1}"

POSIXLY、あなたは使うことができます:

awk 'BEGIN{print toupper(ARGV[1])}' "$1"

またあります:

printf '%s\n' "$1" | tr '[:lower:]' '[:upper:]'

ただし、GNU trを含むいくつかの実装では、シングルバイト文字に対してのみ機能します(UTF-8ロケールでは、ASCII文字でのみ機能します)。

1

それでも${str^^}の試行中にエラーが発生する場合は、python -cまたはPerlを試行できます。これは、bashのバージョンが4よりも低いことが原因である可能性があります。

しかし、これまでのところ、bash 4以降は既存のソリューションで迅速に機能しています。

L2U="I will be upper"

bashでpython -cを使用する

python -c "print('$L2U'.upper())"
I WILL BE UPPER

同様に、capitaliseにも使用できます。

service="bootup.sh on home"
python -c "print('$service'.capitalize())"
Bootup.sh on home

Perlを使用する

echo $L2U | Perl -ne 'print "\U$_"'
I WILL BE UPPER
0
Rakib Fiha