在 bash 中读取单个字符时捕获意外输入

boo*_*ull 1 bash shell-script error-handling test

我有一个 bash 脚本,它曾经要求用户进行确认。我通过读取单个字符来做到这一点,然后将其转换为小写并检查它是否为“y”。如果不是,则脚本退出。

现在,如果我只是在输入读取上按 Enter,我会得到error: unary operator expected. 如何防止此问题或捕获错误?

代码片段:

echo -ne "Confirm [y/n]: "
read -n1 uc

if [ ${uc,,} != "y" ]
then
    exit 0
fi
Run Code Online (Sandbox Code Playgroud)

Mur*_*phy 5

此语句应该正常工作:

if [ "${uc,,}" != "y" ]
Run Code Online (Sandbox Code Playgroud)

说明:当uc为空时,shell 将按如下方式扩展您的测试:

if [  != "y" ]
Run Code Online (Sandbox Code Playgroud)

而带引号的是

if [ "" != "y" ]
Run Code Online (Sandbox Code Playgroud)

经验法则:在扩展包含字符串的 shell 变量周围始终使用引号;它们可能包含空格或为空,当不加引号时,通常会混淆它们传递给的命令(参数过多或缺失)。