4

我有以下情况:

#!/bin/bash

echo "Please enter a word:"
read foobar

该脚本sh script.sh在 Ubuntu 终端中被调用。
在互联网上搜索我找到的解决方案:

foobar=${foobar,,}
echo $foobar

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

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

这确实适用于两者,bashsh,但没有回声它不起作用。
它还会打印两次读取的输入,而不是像这样打印一次:
Y
y

那么如何在sh不打印两次读取输入的情况下做到这一点呢?

4

1 回答 1

7

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

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

如果您正在使用case并且您只需要检查输入是否是yY任何一种方式,您都可以使用这样的 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
于 2013-09-14T12:25:54.970 回答