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
我们该怎么做?
#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 -c
或perl
。这很可能是因为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
评论
它对我来说很好。发布您的整个脚本,该错误可能在其他地方。你的爆炸是指向bash吗?可能与:stackoverflow.com/questions/2264428/…