我有以下情况:
#!/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:]'
哪个确实适用于bash
和sh
,但如果没有回声,它就不起作用。
它还打印读取输入两次而不是如此:
ÿ
ÿ
那么如何在不打印读取输入两次的情况下为sh
执行此操作?
答案 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
整体而言,为了使您的代码在bash
和sh
中都能正常运行,您应该已经删除了特定于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