如何大写命令行参数?

mtk*_*mtk 163 bash string case-sensitivity

我搜索了 SO,发现将以下字符串大写是可行的

str="Some string"
echo ${str^^}
Run Code Online (Sandbox Code Playgroud)

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

试过

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

我们怎么能做到这一点?

Gur*_*uru 182

str^^您尝试的语法可从 Bash 4.0 及更高版本获得。也许你的是一个旧版本(或者你sh明确地运行了脚本):

尝试这个:

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

  • @mtk 那应该是`tr '[az]' '[AZ]'`。 (25认同)
  • 你是对的。我检查了版本,它是 3.2.25。您的解决方案有效,我也尝试了`tr '[az]' [[AZ]'`。 (4认同)
  • 我正在运行 `GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0)`,我得到与 OP 相同的错误,所以我认为这在任何 `bash 上都不可用` 4.0 及以上,如你所说。 (3认同)
  • @ZoeyHewll – `printf` 不接受选项,因此考虑到 `str="-n"` 之类的东西,它更加可靠和可预测(尝试 `echo "-n"` 或 `echo -- "-n"` 与`printf "%s\n" "-n"`)。 (2认同)

小智 131

echo "lowercase" | tr a-z A-Z
Run Code Online (Sandbox Code Playgroud)

输出:

LOWERCASE
Run Code Online (Sandbox Code Playgroud)

  • 我认为 POSIX 在我编辑之前不需要 `tr /az/ /AZ/` 中的 `/`:这只是有效,因为它用 `/` 替换了 `/` 但没用:http://pubs.opengroup。 org/onlinepubs/9699919799/utilities/tr.html 还有更晦涩和不太有用的`tr '[:lower:]' '[:upper:]'`。 (3认同)

小智 28

小心使用 tr ,除非您只使用 AZ。对于其他语言环境,即使 '[: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åäö
Run Code Online (Sandbox Code Playgroud)

  • FWIW, `tr '[:lower:]' '[:upper:]'` 现在至少可以在 OS X 上运行(也可以使用 `LC_ALL=sv_SE`) (2认同)

Sté*_*las 8

或者,您可以切换到 ksh 或 zsh,它们几十年来一直支持大小写转换(早在 4.0 中bash添加${var^^}之前),尽管语法不同:

\n
#! /bin/ksh -\ntypeset -u upper="$1"\nprintf '%s\\n' "$upper"\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

通过zsh,您还可以使用U参数扩展标志或 csh style\xc2\xb9u修饰符:

\n
#! /bin/zsh -\nprintf '%s\\n' "${(U)1}" "$1:u"\n
Run Code Online (Sandbox Code Playgroud)\n

POSIXLY,您可以使用:

\n
awk -- 'BEGIN{print toupper(ARGV[1])}' "$1"\n
Run Code Online (Sandbox Code Playgroud)\n

还有:

\n
printf '%s\\n' "$1" | tr '[:lower:]' '[:upper:]'\n
Run Code Online (Sandbox Code Playgroud)\n

但在包括 GNU 在内的一些实现中tr,它仅适用于单字节字符(因此在 UTF-8 语言环境中,仅适用于 ASCII 字母,不适用于拉丁字母表的重音字母,不适用于连字,不适用于也具有单字节字符的其他字母表中的字母大小写的概念,例如希腊字母或西里尔字母)。

\n

实际上,这些都不适用于没有单字符大写版本的字符,例如\xef\xac\x83大写字母FFI或德语\xc3\x9fperlucupper case)适用于:

\n
$ perl -CSA -le 'print uc for @ARGV' -- gro\xc3\x9f su\xef\xac\x83x\nGROSS\nSUFFIX\n
Run Code Online (Sandbox Code Playgroud)\n

这里需要-CLSA指定,只要 ocale 中使用的字符映射是 UTF-8,Stdio 流和参数就应该以 UTF-8 进行编码。AL

\n
\n

\xc2\xb9 虽然该修饰符最初来自 zsh,但从 1990 年起就已存在于 1.0 中,并由 tcsh 于 1992 年晚些时候在 6.01.03 中复制。

\n