【shell】使用getopts时踩到的坑

作者:wallace-lai
发布:2024-02-02
更新:2024-02-02

错误版本

如下所示,该shell脚本的大意是想从命令行中捕获用户输入的-t选项的值,并将其存入TARGET变量中。

#!/bin/bash

set -e

function main()
{
    while getopts "t:" OPT; do
        case $OPT in
            t)
                TARGET="$OPTARG"
                ;;
            ?)
                echo "Unknow Argument : ${OPT}"
                exit 1
                ;;
        esac
    done

    echo "TARGET : ${TARGET}"
}

BUILD_BASE="$(cd "$(dirname $0)" && pwd)"

main

上述脚本的理想运行结果应该是以下的形式:

$ bash build.sh -t tool
TARGET : tool

然而实际情况是,脚本根本没有捕获到用户输入的-t选项的值:

$ bash build.sh -t tool
TARGET :

正确的版本

百思不得其解之际,将脚本塞给文心一言,问它到底哪里出错了。得知问题出在调用main函数的时候,你没有把脚本参数传递给main函数,人家当然捕获不到了!正确的版本如下所示,只要在main函数的调用后面加上"$@"将脚本参数传递给main函数即可。

main "$@"