getopts 的正确使用方法

Correct way of using getopts

执行以下脚本会导致 mkdir 命令出错

PATH=/root
while getopts "r" name;
do
    case $name in
        r)
            PATH=/home
            ;;
        *)
            echo "Usage: [=10=] -r"
            ;;
    esac
done

echo $PATH
mkdir new

错误:

./test.sh: line 15: mkdir: command not found

这个脚本有什么问题?

你的问题与getopts没有任何关系。

问题出在第一行:

PATH=/root

或者,如果它被执行,这一行:

PATH=/home

这会将命令的搜索路径设置为只是 /root/home 目录。 (通常这些目录都不包含任何命令)。

设置$PATH会丢弃之前的值。 mkdir 可能在 /bin 中,但由于 /bin 不再在 $PATH 中,shell 无法找到它。

您不会在 getopts 命令上收到错误,因为它内置于您正在使用的 shell 中。

如果您想将 /root 添加到您的 $PATH,请使用:

PATH="/root:$PATH"

PATH="$PATH:/root"

但是您的脚本中似乎没有任何内容依赖于 $PATH 中的 /root。你为什么要首先做 PATH=/root?如果您尝试将当前工作目录设置为 /root/home,您需要 chdir 命令。