在shell中将文本转换为大写

17

我正在从键盘读取一个字符,并将其转换为大写,然后再次显示该字符。

但是以下代码会产生错误:

read a;
a=echo $a | tr 'a-z' 'A-Z'
echo $a

我也尝试过这个:

read option;
eval $(awk -v option=$option '{print "a="toupper(option);}')
echo $a
7个回答

38

如果您想将a的结果存回到a中,则可以使用命令替换:

read a;
a=$(echo $a | tr 'a-z' 'A-Z')
echo $a

这适用于某些语言,但不是所有语言都适用。请参见 https://dev59.com/uGYr5IYBdhLWcg3waJdT#68455313 以获取更广泛适用的解决方案。具体来说,请像这样使用 trtr [:lower:] [:upper:]; - pattivacek

30

可以使用Bash原生命令实现如下:

read a;
a="${a^^}"
echo "$a"

不需要调用其他命令,像 tr 这样的命令,因为Bash可以自己完成。

另请参阅:Bash参数扩展


3
我认为原作者从未提到使用了哪种Shell。 - axiom
1
因为不起作用而递减:# a="${a^^}" -bash: ${a^^}: 错误的替换 - Kevin Buchs
你是怎么启动 bash 的,@KevinBuchs?这在这里可以工作,但在 sh 中却不行。另外,在那个点上变量 a 的内容是什么?对我来说,这是最优雅的解决方案,因为它避免了进一步分叉进程。 - Ulrich Eckhardt
4
^^ 参数扩展是在 Bash 4.0 版本中添加的。 - nisetama

11

AWK是一种拥有完整Unicode支持的转换大小写的正确方式 ;-)

echo "öäüßè" | awk 'BEGIN { getline; print toupper($0) }'

6

使用命令替换

a=`echo $a | tr 'a-z' 'A-Z'`

请注意在echotr周围的反引号 `


你之前也提到过类似的评论,但是在这里你假设shell是bash(或者足够相似),这并不适用于fish - Ulrich Eckhardt

4

使用Bash脚本

printf "Type your Message Here: " read message

echo Upper Case: $message | tr [:lower:] [:upper:];
echo Lower Case: $message | tr [:upper:] [:lower:]

1

awk 在这里不是正确的方法,但以下是一种可能的实现方式:

a=$(awk 'BEGIN { getline; print toupper($0) }')
echo $a

0

无法获取

a=`echo $a | tr 'a-z' 'A-Z'` 

有工作,但是

a=`echo $a | tr '[a-z]' '[A-Z]'`

注意额外的正则表达式[]括号。
在/usr/bin/sh脚本中,这个命令可以正常工作。

...
while getopts ":l:c:" option; do  
   case "$option"  
   in  
      l) L_OPT=`echo ${OPTARG}| tr '[a-z]' '[A-Z]'`  
         ;;  
      c) C_OPT=`echo ${OPTARG} | tr '[a-z]' [A-Z]'`  
         ;;  
      \?)  
         echo $USAGE  
         exit 1  
         ;;  
   esac  
done  
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接