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

问题描述 投票:1回答:2

我试图通过传递绝对路径作为第一个参数($ 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

我不确定该如何处理。欢迎任何提示,谢谢。

bash shell sh getopt getopts
2个回答
0
投票

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

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

while getopts :lq flag; do
    ...
done

0
投票

[在文件参数前保留选项(即绝对路径)。许多标准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
© www.soinside.com 2019 - 2024. All rights reserved.