我有以下情况:
#!/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:]'
这确实对bash
和sh
,但是没有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
作为一个整体,使你的代码在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