我搜索了SO,发现使用大写的字符串可以工作

str="Some string"
echo ${str^^}


,但是我尝试在命令行参数上做类似的事情,这给了我以下内容错误

尝试

#!/bin/bash
             ## Output
echo ${1^^}  ## line 3: ${1^^}: bad substitution
echo {^^}  ## No error, but output was still smaller case i.e. no effect


我们该怎么做?

评论

它对我来说很好。发布您的整个脚本,该错误可能在其他地方。你的爆炸是指向bash吗?

可能与:stackoverflow.com/questions/2264428/…

#1 楼

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

请尝试以下操作:

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


评论


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

–manatwork
2012年10月16日12:46

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

–伯恩哈德
2012年10月16日12:48

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

–mtk
2012年10月16日12:51

@mtk应该是tr'[a-z]''[A-Z]'。

–l0b0
2012年10月17日9:43

我正在运行GNU bash版本4.3.42(1)-发行版(x86_64-apple-darwin14.5.0),并且收到与OP相同的错误,因此我认为这不适用于任何bash 4.0及更高版本正如你所说。

–希思边界
16 Jan 26 '23:19



#2 楼

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


输出:

LOWERCASE


评论


我认为POSIX在我进行编辑之前并不需要tr / az / / AZ /中的/:之所以起作用,是因为它用/代替了/,但没有用:pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.html那里还存在更加晦涩和有用的tr'[:lower:]''[:upper:]'。

– Ciro Santilli郝海东冠状病六四事件法轮功
18年5月9日在16:22



正确。 tr非常不同,但是可以。

–道格
'18 Sep 6'在16:52

变音符号无法解决此问题。

–Evgeny
19年1月31日在15:04

正如@CiroSantilli冠状病毒审查六四事件法轮功提到的那样,您可以使用`tr'[:lower:]''[:upper:]'处理非a-z字符。 (实际上,“不太有用”的注释似乎相反。使用小写/大写可覆盖更大范围的字符。)

– Jasonkarns
20-4-8在13:30



#3 楼

除非使用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(q4312078q)}'
ABCÅÄÖ
$ echo ${str^^} # Bash 4.0 and later
ABCÅÄÖ
$ STR="ABCÅÄÖ"
$ echo ${STR,,}
abcåäö


评论


FWIW,tr'[:lower:]''[:upper:]'现在至少在OS X上适用于您的示例(也适用于LC_ALL = sv_SE)

– Ethan
17年3月31日在21:57

#4 楼

另外,您可以切换到数十年以来一直支持大小写转换的ksh或zsh(早于4.0中添加bash${var^^}),但是使用了不同的语法:

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


(也适用于zsh;请注意,在pdksh / mksh中,仅适用于ASCII字母)。

对于zsh,还可以使用U参数扩展标志:

#! /bin/zsh -
printf '%s\n' "${(U)1}"


POSIXLY,可以使用:

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


还有:

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


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

#5 楼

如果仍然有人尝试${str^^}出错,则可以尝试python -cperl。这很可能是因为bash版本低于4。

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

L2U="I will be upper"


在bash中使用python -c

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