我试图通过传递绝对路径作为第一个参数($ 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 [[ $1 != -* ]]; then
path=$1
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