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)
小智 131
echo "lowercase" | tr a-z A-Z
Run Code Online (Sandbox Code Playgroud)
输出:
LOWERCASE
Run Code Online (Sandbox Code Playgroud)
小智 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)
或者,您可以切换到 ksh 或 zsh,它们几十年来一直支持大小写转换(早在 4.0 中bash添加${var^^}之前),尽管语法不同:
#! /bin/ksh -\ntypeset -u upper="$1"\nprintf '%s\\n' "$upper"\nRun Code Online (Sandbox Code Playgroud)\n(也适用于zsh;请注意,在 pdksh/mksh 中,仅适用于 ASCII 字母)。
通过zsh,您还可以使用U参数扩展标志或 csh style\xc2\xb9u修饰符:
#! /bin/zsh -\nprintf '%s\\n' "${(U)1}" "$1:u"\nRun Code Online (Sandbox Code Playgroud)\nPOSIXLY,您可以使用:
\nawk -- 'BEGIN{print toupper(ARGV[1])}' "$1"\nRun Code Online (Sandbox Code Playgroud)\n还有:
\nprintf '%s\\n' "$1" | tr '[:lower:]' '[:upper:]'\nRun Code Online (Sandbox Code Playgroud)\n但在包括 GNU 在内的一些实现中tr,它仅适用于单字节字符(因此在 UTF-8 语言环境中,仅适用于 ASCII 字母,不适用于拉丁字母表的重音字母,不适用于连字,不适用于也具有单字节字符的其他字母表中的字母大小写的概念,例如希腊字母或西里尔字母)。
实际上,这些都不适用于没有单字符大写版本的字符,例如\xef\xac\x83大写字母FFI或德语\xc3\x9f。perl的uc(upper case)适用于:
$ perl -CSA -le 'print uc for @ARGV' -- gro\xc3\x9f su\xef\xac\x83x\nGROSS\nSUFFIX\nRun Code Online (Sandbox Code Playgroud)\n这里需要-CLSA指定,只要 ocale 中使用的字符映射是 UTF-8,Stdio 流和参数就应该以 UTF-8 进行编码。AL
\xc2\xb9 虽然该修饰符最初来自 zsh,但从 1990 年起就已存在于 1.0 中,并由 tcsh 于 1992 年晚些时候在 6.01.03 中复制。
\n| 归档时间: |
|
| 查看次数: |
270468 次 |
| 最近记录: |