ksh 正则表达式错误'=〜`意外
Posted
技术标签:
【中文标题】ksh 正则表达式错误\'=〜`意外【英文标题】:ksh regex error '=~` unexpectedksh 正则表达式错误'=〜`意外 【发布时间】:2015-01-08 16:55:34 【问题描述】:我有一个 rpm 规范,它在 %pre 部分运行一些测试。
我正在使用 AIX 5.3 和 korn shell。
我的脚本从 ps 中提取一些东西,即 foo 和 foobar(我只想要 foo),然后测试每个值以查看它是否与模式匹配。
但是代码
if [[ $x =~ foo$ ]]; then echo match fi
返回错误=~意外
人说字符串=~ere
如果字符串匹配模式 ~(E)ere 则为真,其中 ere 是扩展的正则表达式。
所以看来=~是支持的。
我做错了什么?
【问题讨论】:
为什么不让grep
为您应用正则表达式,而不是后处理? (如果我更了解你的平台,我建议使用更适合该任务的工具,而不是 grepping ps
的输出—— pgrep 和 kin 在 Linux 上更有可能是正确的东西,但我没有一个 AIX 系统来检查/测试)。
谢谢。我确实可以尝试这个,因为最终我希望我的脚本能够同时在 AIX/Linux KSH88/Bash 上工作
【参考方案1】:
您所做的事情(检查字符串是否具有给定的后缀)根本不需要正则表达式。
if [[ $x = *foo ]]; then echo match; fi
...提供与
等效的行为if [[ $x =~ foo$ ]]; then echo match; fi
...但是,当然,可以在没有后一个功能的 shell 上工作。
如果您确实想在[[ ]]
中使用=~
,那么请确保您正在运行ksh93; AIX 上的默认 ksh 是一个更老的实现。
要运行 ksh93,请使用 #!/usr/bin/ksh93
而不是 #!/usr/bin/ksh
开始您的脚本。
【讨论】:
当您尝试匹配的字符串有前导空格[[ $x = * foo ]]
似乎不起作用时,您将如何使用它,前导空格会导致语法错误,因为 * 不是预期的跨度>
@Nicolasome, [[ $x = *" "foo ]]
很好。这不是关于 *
的意外,而是关于 =
只期望其右侧有一个单词,并且需要引用或转义以确保 RHS 内容解析为一个单词。
@Nicolasome, ...顺便说一句,您可以随时设置var='* foo'
,然后检查是否[[ $x = $var ]]
;当以这种方式使用时,它仍会将*
视为通配符(而如果您添加引号并将其设为[[ $x = "$var" ]]
,那么它会将*
视为要匹配的精确字符串)。
以上是关于ksh 正则表达式错误'=〜`意外的主要内容,如果未能解决你的问题,请参考以下文章