如何传递标志以外的其他参数

how to pass other arguments besides flags

我试图通过传入绝对路径作为第一个参数 ($1) 来执行我的文件。我还想从该绝对路径向前添加标志,但我不知道如何告诉 optargs 从 $2 开始向前计数,因为如果我将绝对路径作为 $1 传递,它似乎会打破 getopts 循环。

我猜我必须为以下代码中的第一个参数实现转换:

while getopts :lq flag; do
case $flag in
l) echo "executing -l flag"
;;
q) echo "executing -q flag"
;;
esac
done

我不确定如何处理这个问题。欢迎任何提示,谢谢。

getopts 确实在看到第一个非选项参数时停止处理参数。对于你想要的,如果第一个参数不是一个选项,你可以显式地移动它。像

if [[  != -* ]]; then
    path=
    shift
fi

while getopts :lq flag; do
    ...
done

保留文件参数前的选项(即绝对路径)。 许多标准 bash 命令遵循相同的做法。

示例:

wc -wl ~/sample.txt
ls -lR ~/sample_dir

所以如果你按照上面的做法,你的代码就会变成这样。 即使未提供选项,此代码也能正常工作。 通常,这是带有选项的期望行为。

# Consider last argument as file path
INPUT_FILEPATH=${*: -1} 
echo $INPUT_FILEPATH

# Process options
while getopts :lq flag
do
case $flag in
l) echo "executing -l flag"
;;
q) echo "executing -q flag"
;;
esac
done

示例执行:

bash sample.sh /home/username/try.txt

/home/username/try.txt

bash sample.sh -lq /home/username/try.txt

/home/username/try.txt
executing -l flag
executing -q flag