私は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
どうすればよいでしょうか?
構文str^^
は、Bash 4.0以降で使用できます。おそらくあなたのバージョンは古いバージョンです(または明示的にsh
でスクリプトを実行しました):
これを試して:
str="Some string"
printf '%s\n' "$str" | awk '{ print toupper($0) }'
echo "lowercase" | tr a-z A-Z
出力:
LOWERCASE
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åäö
あるいは、何十年も大文字小文字変換をサポートしている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文字でのみ機能します)。
それでも${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