csh/tcsh 如何查找特定字符串是否在变量/文件名中?

问题描述

我想检查一个特定的字符串是否在文件名(这是一个变量)中。 [在 csh/tcsh]

#!/bin/tcsh
set file = 'KZ.KKAR..BHZ.2008-01-18T19-16-51.SAC'
set string = 'BHZ'
echo $file
if [[$file == *$string*]];then
    echo 'string contains in this'
else 
    echo "NOOOOOOOOO"
endif

类似的东西。 要么 如果可能,在一行代码

解决方法

您可以使用 =~ 来匹配 glob 模式:

if ( $file =~ *$string* ) then

注意 [[..]]; then 不是有效的 (t)csh 语法;这仅适用于 Bourne shell。

这在 man tcsh 中有记录:

'==' '!=' '=~' 和 '!~' 运算符将它们的参数作为字符串进行比较;全部 其他人对数字进行操作。运算符 '=~' 和 '!~' 类似于 '!=' 和 '==' 除了右手边是一个全局模式(参见文件名替换) 左手操作数与之匹配。这减少了使用的需要 当真正需要所有这些时,shell 脚本中的 switch 内置命令 是模式匹配。

正如文档中提到的,switch 也可以使用 glob 模式,类似于 Bourne 外壳。