명령 행 인수를 대문자로 바꾸는 방법?


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
그것은 나를 위해작동 합니다. 전체 스크립트를 게시하면 오류가 발생했을 수 있습니다. 당신의 shebang이 가리키는가 bash?
manatwork

답변:


151

str^^시도하는 구문 은 Bash 4.0 이상에서 사용할 수 있습니다. 아마도 귀하의 버전이 이전 버전 일 수도 있습니다 (또는 sh명시 적으로 스크립트를 실행 한 경우 ).

이 시도:

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

1
mtk의 말에서 나는 대소 문자 수정이 실제로 변수로 작동한다는 것을 이해했습니다.
manatwork

1
@manatwork 초기 질문에는 명확하게 언급되어 있지 않습니다. 잘못된 대체 오류 메시지는 이전 bash 버전에서와 동일합니다.
Bernhard

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와 동일한 오류가 발생하므로 bash4.0 이상 에서 사용할 수 있다고 생각하지 않습니다 .
Heath Borders

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은 매우 다르지만 작동합니다.
Doug

움라우트는이 작업을하지 않습니다.
Evgeny

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 문자에만 작동합니다).

와 함께 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를 포함한 일부 구현에서는 tr1 바이트 문자 (ASCII 문자에서만 UTF-8 로케일)에서만 작동합니다.


0

누군가가 여전히 오류가 시도하게 될 경우 ${str^^}, 당신은 시도 할 수 있습니다 python -c또는 perlbash는 버전 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.