我正在尝试创建一个bash程序,如果程序提供了--file参数后跟一个选项,其中选项不应以短划线开头,那么将结果保存到具有用户选择名称的文件中。所以我使用了以下条件:
if [[ -n $2 && !($2="[^-]") ]]
但那没用。即使第二个参数以短划线开头,它仍会将输出保存到文件中。我也试过用这个:
1) if ! [[ -z $2 && ($2="[^-]") ]]
它也像前一个那样。有什么问题?提前谢谢!
答案 0 :(得分:3)
作为模式匹配,这可能如下所示:
[[ $2 ]] && [[ $2 != -* ]]
注意:
&&
之外移动[[ ]]
不是强制性的,但它是一种好形式:它确保您的代码可以重写以使用POSIX test
命令而无需使用过时功能(-a
和-o
)或需要重组。!($2="[^-]")
中,!
,(
和)
以及=
都不会被解析为单独的运算符。=
和!=
检查模式匹配,而不是正则表达式。 [[ ]]
中的正则表达式运算符为=~
。在差异中,锚点(^
在字符串的开头匹配,或者$
在末尾匹配)隐含在模式中,而它们需要在正则表达式中显式,并且{{ 1}}具有非常不同的含义(模式中的*
与正则表达式中的*
意味着相同。).*
中的^
已经否定 [^-]
,因此除了使用-
之外,您的代码只会与之匹配当第二个参数中 一个破折号时。自己测试一下:
!