web-dev-qa-db-ja.com

Bashで文字列を大文字から小文字に変換する方法は?

文字列値を大文字から小文字に変換する方法を探しています。すべての検索結果は、trコマンドを使用したアプローチを示しています。

trコマンドの問題は、echoステートメントでコマンドを使用した場合にのみ結果を取得できることです。例えば:

y="HELLO"
echo $y| tr '[:upper:]' '[:lower:]'

上記は機能し、「hello」になりますが、次のように結果を変数に割り当てる必要があります。

y="HELLO"
val=$y| tr '[:upper:]' '[:lower:]'
string=$val world

上記のような値を割り当てると、空の結果が得られます。

PS:私のBashバージョンは3.1.17です

76
raga

Bash 4を使用している場合、次のアプローチを使用できます。

x="HELLO"
echo $x  # HELLO

y=${x,,}
echo $y  # hello

z=${y^^}
echo $z  # HELLO

,または^を1つだけ使用して、最初の文字をlowercaseまたはuppercaseにします。

128
kev

コードを実装する正しい方法は

y="HELLO"
val=$(echo "$y" | tr '[:upper:]' '[:lower:]')
string="$val world"

これは、$(...)表記を使用して、コマンドの出力を変数にキャプチャします。 string変数を囲む引用符にも注意してください。$valworldstringに割り当てられる単一のものであることを示すために必要です。

bash 4.0以降を使用している場合、より効率的でエレガントな方法は、bash組み込みの文字列操作を使用することです。

y="HELLO"
string="${y,,} world"
56
Rody Oldenhuis

trはプレーンASCIIのみを処理できるため、国際文字に直面するとtrベースのソリューションは失敗します。

Bash 4ベースの${x,,}ソリューションについても同様です。

一方、awkツールは、UTF-8 /マルチバイト入力でも適切にサポートします。

y="HELLO"
val=$(echo "$y" | awk '{print tolower($0)}')
string="$val world"

liborw の好意による回答。

17
DevSolar

バックティックで実行してみませんか?

 x=`echo "$y" | tr '[:upper:]' '[:lower:]'` 

これにより、コマンドの結果がバックティックで変数xに割り当てられます。 (つまり、trに特有のものではありませんが、シェルスクリプトの一般的なパターン/ソリューションです)

バックティックの代わりに$(..)を使用できます。詳細については here を参照してください。

14
Brian Agnew

私はUbuntu 14.04で、Bashバージョン4.3.11を使用しています。ただし、文字列操作${y,,}に組み込まれた楽しみはまだありません

これは、大文字を強制するためにスクリプトで使用したものです。

CAPITALIZED=`echo "${y}" | tr '[a-z]' '[A-Z]'`
6
BoomShadow

Declare(old:typeset)を使用して変数を定義すると、変数の使用中に値の大文字と小文字を区別できます。

$ declare -u FOO=AbCxxx
$ echo $FOO
ABCXXX

"-l"はlcを実行します。

5
Steven Powell

これは私のために働いた。ロディありがとう!

y="HELLO"
val=$(echo $y | tr '[:upper:]' '[:lower:]')
string="$val world"

変数の隣にアンダースコアを使用している場合、1つの小さな変更{{で変数名をカプセル化する必要があります。

string="${val}_world"
2
Ray Moncada