Bash 用于测试是否仅存在标志的脚本
Bash script to test for only presence of flag
我有一个 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
只将它们作为参数而不是选项获取:
while [ -n "" ]; do
case "" in
-r) echo "read";;
-w) echo "write";;
esac
shift
done
如评论中所述,冒号 (:
) 表示前面的选项字符需要一个参数。只需删除冒号:
#!/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
所做的其他更改:最后一个案例的引号移动到包括方括号,输出到标准错误 (>&2
) 以避免不恰当地通过管道传输,添加了 shift
行以便您的参数列表 ( $@
和 </code> 等)删除了 getopts-parsed 选项,并且在测试周围放置了引号,否则 shell 会抱怨通过了空测试(它会看到 <code>[[ -eq 1]]
如果任一变量未定义,如果未传递 -r
或 -w
将发生这种情况,并且这是无效的,而 [[ "" -eq 1 ]]
将简单地评估为 false)。
我有一个 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
只将它们作为参数而不是选项获取:
while [ -n "" ]; do
case "" in
-r) echo "read";;
-w) echo "write";;
esac
shift
done
如评论中所述,冒号 (:
) 表示前面的选项字符需要一个参数。只需删除冒号:
#!/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
所做的其他更改:最后一个案例的引号移动到包括方括号,输出到标准错误 (>&2
) 以避免不恰当地通过管道传输,添加了 shift
行以便您的参数列表 ( $@
和 </code> 等)删除了 getopts-parsed 选项,并且在测试周围放置了引号,否则 shell 会抱怨通过了空测试(它会看到 <code>[[ -eq 1]]
如果任一变量未定义,如果未传递 -r
或 -w
将发生这种情况,并且这是无效的,而 [[ "" -eq 1 ]]
将简单地评估为 false)。