如何大写命令行参数?


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吗?
manatwork,2012年

Answers:


151

str^^Bash 4.0及更高版本提供了您尝试的语法。也许您的是较旧的版本(或者您sh显式运行了脚本):

尝试这个:

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

1
用mtk的话来说,我知道大小写修改实际上对他有用。
manatwork,2012年

1
@manatwork在最初的问题中没有明确指出。错误的替换错误消息与较旧的bash版本相同。
Bernhard

4
你是对的。我检查了版本3.2.25。您的解决方案有效,我也尝试过tr '[a-z]' [[A-Z]'
mtk 2012年

20
@mtk应该是tr '[a-z]' '[A-Z]'
l0b0 2012年

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非常不同,但是可以。
道格

变音符号无法解决此问题。
叶夫根尼

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
Ethan

1

或者,您可以切换到已经有几十年(很久以前的情况下转换支持的ksh或zsh中bash${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}"

适当地,您可以使用:

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

还有:

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

但是在包括GNU在内的一些实现中,tr该方法仅适用于单字节字符(因此在UTF-8语言环境中,仅适用于ASCII字母)。


0

如果有人仍在尝试错误${str^^},则可以尝试python -c或,perl这可能是因为bash版本低于4。

但是,到目前为止,bash 4或更高版本正在与现有解决方案迅速合作。

L2U="I will be upper"

python -c在bash中使用

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.