将读取变量转换为小写

时间:2013-09-14 12:22:22

标签: linux bash shell ubuntu-12.04 sh

我有以下情况:

#!/bin/bash

echo "Please enter a word:"
read foobar

在Ubuntu终端中使用sh script.sh调用脚本 在互联网上搜索我发现的解决方案:

foobar=${foobar,,}
echo $foobar

上述方法仅适用于bash script.sh
所以我继续研究并发现:

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

哪个确实适用于bashsh,但如果没有回声,它就不起作用。
它还打印读取输入两次而不是如此:
ÿ
ÿ

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

1 个答案:

答案 0 :(得分:4)

这可能是因为您尚未将已翻译的输出分配给变量。另外,我建议引用双引号周围的变量来防止单词拆分和路径名扩展。

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