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


125

私は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

どうすればこれができますか?


8
それは私のためにうまく動作します。スクリプト全体を投稿すると、おそらく他の場所にエラーがあります。あなたのシバンは指していbashますか?
マナトワーク

回答:


151

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

これを試して:

str="Some string"
printf '%s\n' "$str" | awk '{ print toupper($0) }'

1
mtkの言葉から、大文字と小文字の変更は実際には変数を使用して彼に対して機能することがわかりました。
マナトワーク

1
@manatworkそれは最初の質問で明確に述べられていません。不正な置換エラーメッセージは、古いbashバージョンで表示されるものと同じです。
ベルンハルト

4
あなたは正しいです。バージョン3.2.25を確認しました。あなたの解決策は機能し、私も試しtr '[a-z]' [[A-Z]'ました
mtk

20
@mtkであるべきですtr '[a-z]' '[A-Z]'
l0b0

2
私は実行していGNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0)ますが、OPと同じエラーが発生しますのでbash、あなたが言うように4.0以上で利用できるとは思いません。
ヒース国境

79
echo "lowercase" | tr a-z A-Z

出力:

LOWERCASE

1
私は、POSIXは必要ありませんだと思う/ようでtr /a-z/ /A-Z/、私の編集前に:それは置き換えられますので、これはちょうど働く/ことで/はなく無用です:pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.htmlももっとあいまいとあまり有用が存在しますtr '[:lower:]' '[:upper:]'
Ciro Santilli新疆改造中心法轮功六四事件

正しい。trは非常に異なりますが、動作します。
ダグ

ウムラウトはこれでは動作しません。
エフゲニー

22

AZだけを使用する場合を除き、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åäö

1
FWIW、 tr '[:lower:]' '[:upper:]'(とも少なくともOS X上であなたの例のために今働いているLC_ALL=sv_SE
イーサン・

1

また、あなたは(長い前に、数十年のためのケース変換のサポートがあったのkshまたはzshのに切り替えることができbash「はsは${var^^}いえ異なる構文で、4.0で追加します):

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

(これも動作しzshます; pdksh / mkshでは、ASCII文字に対してのみ動作することに注意してください)。

ではzshUパラメータ展開フラグも使用できます。

#! /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文字のみで機能します)。


0

誰かがまだ${str^^}試してエラーが発生している場合は、試してみるpython -cperl、bashバージョンが4よりも低い可能性があります。

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

L2U="I will be upper"

python -cbashで使用する

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

同様に、次の大文字で使用することもできます。

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.