如何传递标志以外的其他参数
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
我试图通过传入绝对路径作为第一个参数 ($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