bash 在父 shell 中执行替换的命令。如果条件未评估

bash 在父 shell 中执行替换的命令。如果条件未评估

作为我个人使用的大型系统维护脚本的一部分,我正在编写一个小脚本来检查 snap 包的更新,显示可用的更新(如果有)并提示我是否允许继续进行上述更新。如果没有更新,它应该会通知我。这种行为是大多数流行的包管理器 CLI 的常态,但是,由于它不会sudo snap refresh --list提示用户接受它找到的任何更新*,而是sudo snap refresh自动接受它找到的所有更新,所以我发现自己不得不拼凑一个 shell 脚本来复制一些标准的包管理器功能,并让自己重新掌控一切。

*我今天才发现snap refresh --list,还没有机会亲眼看到它的实际效果,但看起来仅显示更新信息并且不会提示用户实际下载并安装它找到的更新。

我的脚本如下:

#!/usr/bin/env bash

if [[ "$(snap refresh --list)" != "All snaps up to date." ]]
    then
        snap refresh --list
        echo -e "\nType 'y' or 'yes' and press [ENTER] to update the above snap(s). Any other response aborts."
        read -r -p "Your choice: " choice
        case "$choice" in 
            y|Y|yes|Yes|YEs|YES|yES|yeS|YeS|yEs ) echo ""; sudo snap refresh;;
            * ) echo -e "\nOperation aborted. Snaps not updated.";;
        esac
    else
        echo "All snaps up to date. blah blah blah."
        #  echoing because I don't want the actual output of "snap refresh --list" to suddenly change in the middle of script execution (however unlikely this is) and throw me off.
        #  "blah blah blah" added just for testing this particular bug.
fi

如果所有 snap 包都已更新,则预期输出为:All snaps up to date. blah blah blah.。如果任何 snap 包都有可用的更新,则应该显示受影响包的详细信息,并且应该提示我提供权限。

当没有更新时,我实际得到的信息是:

All snaps up to date.
All snaps up to date.

Type 'y' or 'yes' and press [ENTER] to update the above snap(s). Any other response aborts.
Your choice: h

Operation aborted. Snaps not updated.

或这个:

All snaps up to date.
All snaps up to date.

Type 'y' or 'yes' and press [ENTER] to update the above snap(s). Any other response aborts.
Your choice: y

All snaps up to date.

有时,看似随机,我在最后会收到以下错误:

/path/to/script.sh: line 18: testing: command not found
/path/to/script.sh: line 19: syntax error near unexpected token `fi'
/path/to/script.sh: line 19: `fi'

我尚未能够测试此脚本在更新可用时会做什么。但可以肯定地说它不会起作用。至少语句case有效。壳牌检测说没有检测到问题。

我确信我犯了一些绝对新手的错误。但是,作为一个绝对的新手,我绞尽脑汁却无济于事。这里出了什么问题,我该如何解决?

我知道 snap 每天都会自动更新。我喜欢看到它的实际运行,编写脚本对我来说也是一种学习练习。

相关内容