我有一个 bash 脚本,需要接收带有标志的用户名,然后我希望能够查找 -r 或 -w 来指示这是读取还是写入。
目前我正在使用 get opts,但这需要将实际参数传递给 -r 和 -w。
如何测试是否只有 -r 或 -w 存在而不向这些标志传递某些内容。
目前我的脚本如下所示:
#!/bin/bash
while getopts :u:r:w: opt; do
case $opt in
u ) user="$OPTARG" ;;
r ) my_read=1 ;;
w ) my_write=1 ;;
\? ) echo "${0##*/}" [ -erw ]; exit 1 ;;
esac
done
if [[ ${my_write} -eq 1 ]] ; then
echo "write"
fi
if [[ ${my_read} -eq 1 ]] ; then
echo "read"
fi
Run Code Online (Sandbox Code Playgroud)
如注释中所述,冒号 ( :) 表示前面的选项字符需要参数。只需删除冒号:
#!/bin/bash
while getopts u:rw opt; do
case $opt in
u ) user="$OPTARG" ;;
r ) my_read=1 ;;
w ) my_write=1 ;;
\? ) echo "${0##*/} [ -erw ]" >&2; exit 1 ;;
esac
done
shift $((OPTIND-1))
if [[ "${my_write}" -eq 1 ]] ; then
echo "write"
fi
if [[ "${my_read}" -eq 1 ]] ; then
echo "read"
fi
Run Code Online (Sandbox Code Playgroud)
所做的其他更改:最终案例中的引号移至包含方括号,输出到标准错误 ( >&2) 以避免不恰当地进行管道传输,shift添加了该行,以便您的参数列表($@和$1等)删除了 getopts-parsed 选项,并且引号被放置在测试周围,因为否则 shell 可能会抱怨通过了空测试(它将查看[[ -eq 1]]是否有一个变量未定义,如果 或-r未-w通过,则会发生这种情况,并且这是无效的,而[[ "" -eq 1 ]]只会评估为 false)。