将读取的variables转换为小写

我有以下情况:

#!/bin/bash echo "Please enter a word:" read foobar 

脚本在Ubuntuterminal中使用sh script.sh进行调用。
在互联网上search我find的解决scheme:

 foobar=${foobar,,} echo $foobar 

上面的方法只适用于bash script.sh
于是我继续研究,发现:

 echo $foobar | tr '[:upper:]' '[:lower:]' 

这确实对bashsh ,但是没有echo,它就不起作用。
它也打印读取input两次,而不是像这样:
ÿ
ÿ

那么如何在不打印读取input两次的情况下对sh执行此操作?

这可能是因为你没有把翻译的输出分配给一个变量。 此外,我建议引用双引号的变量,以防止分词和路径名扩展。

 foobar=$(echo "$foobar" | tr '[:upper:]' '[:lower:]') 

如果你正在使用case ,你只需要检查输入是y还是Y ,那么你可以使用像这样的glob模式。 没有必要将其转换为小写形式。

 case $foobar in [yY]) echo "User said yes." ;; *) echo "User said no." ;; esac 

你也可以通过使用-s来禁止显示用户输入:

 read -s foobar 

作为一个整体,使你的代码在bashsh中都能正常工作,你应该已经删除了特定于bash的部分:

 #!/bin/bash echo "Please enter a word:" read -s foobar foobar=$(echo "$foobar" | tr '[:upper:]' '[:lower:]') echo "$foobar" 

如果只是显示较小的表单,则可以跳过作业。 但是不要使用另一个回声:

 #!/bin/bash echo "Please enter a word:" read -s foobar echo "$foobar" | tr '[:upper:]' '[:lower:]' 

case另一种形式。 这是为了POSIX兼容。

 if [ "$foobar" = y ] || [ "$foobar" = Y ]; then echo "User said yes." else echo "User said no." fi 

在bash中可能就是这样。 即使在不支持${parameter,,}功能的早期版本中,它也可以工作。

 if [[ $foobar == [yY] ]]; then echo "User said yes." else echo "User said no." fi