【发布时间】:2020-12-11 23:20:14
【问题描述】:
这是 bash 脚本的一部分,其中显示了行号。我可以理解 getopts 在 bash 中的工作原理,但无法理解第 116 行。if [[ ! " ${FS_OPTIONS[@]} " =~ " $OPTARG " ]]; then 部分。在脚本的前面有
#!/usr/bin/env bash
FS_OPTIONS=("ubuntu" "busybox")
while getopts "hsf:" opt; do
case $opt in
f)
if [[ ! " ${FS_OPTIONS[@]} " =~ " $OPTARG " ]]; then
echo "Unsupported filesystem $OPTARG"
echo "Use ubuntu/busybox"
exit -1
else
echo "ok!"
export FILESYSTEM=$OPTARG
fi
;;
esac
done
ckim@chan-ubuntu:~/testbash$ test3.sh -f ubuntu
ok!
ckim@chan-ubuntu:~/testbash$ test3.sh -f busybox
ok!
ckim@chan-ubuntu:~/testbash$ test3.sh -f ubunt.
Unsupported filesystem ubunt.
Use ubuntu/busybox
我把条件行改成if [[ ! " ${FS_OPTIONS[@]} " =~ $OPTARG ]]; then,可以看到右边是正则表达式。现在我可以看到了
ckim@chan-ubuntu:~/testbash$ test3.sh -f ubunt.
ok!
这是因为 " " 被删除了,并且参数被视为正则表达式。
bash 手册说
另外一个二元运算符 =~ 可用,其优先级与 == 和 != 相同。使用时, 运算符右侧的字符串被视为扩展正则表达式并进行相应匹配 (如正则表达式(3))。如果字符串与模式匹配,则返回值为 0,否则为 1。
这在我的问题之前很久了。我的第一个问题是:根据我上面观察到的情况,当模式匹配时,=~ 返回 1。(它之前有 !)而不是手册。我错过了什么吗?
我的第二个问题:使用原始if [[ ! " ${FS_OPTIONS[@]} " =~ " $OPTARG " ]]; then 有哪些用例?利用正则表达式?因为它有“”,所以它将参数作为字符串(不将其作为正则表达式)。 =~ 和 " " 有什么用处吗?
【问题讨论】:
-
(it has ! before) as opposed to the manual.这怎么“反对”?有! expression True if expression is false。 -
也就是说,请注意关于语言设计的“为什么”问题在这里通常是题外话;见meta.stackexchange.com/a/170415/144918
-
@KamilCuk 例如,当我给
-f ubuntu时,显示它匹配(上面打印了ok)。这意味着第一个if ( ! ... =~ ... )部分没有被占用,这意味着 =~ 部分返回 1。所以我给出了一个匹配模式,但 =~ 返回 1。(手册说它在匹配时返回 0)。我错过了什么吗? -
(顺便说一句,
exit -1在 shell 中通常没有意义:UNIX 退出状态是一个 无符号 整数;因此,负数总是被转换为正数)。 -
...另外,
[[ ! " ${FS_OPTIONS[@]} " =~ " $OPTARG " ]]不是很好的形式。在不允许字符串扩展为多个单词的上下文中,它应该使用[*]而不是[@]。
标签: bash