检查 4 个变量之一是否以 ksh 中的字符串 &red 开头

检查 4 个变量之一是否以 ksh 中的字符串 &red 开头

我正在尝试检查 4 个变量之一是否以字符串“&red”开头,并且我正在努力让匹配正常工作。目前我已经得到了这个,

if [[ $filemsgCICS = "&red"* || $filemsgCICSU1 = "&red"* || $snufmsgCICS = "&red"* || $snufmsgCICSU1 = "&red"* ]];then

但这行不通。我似乎找不到可行的解决方案。我尝试过 '&red'* 和 \&red* 但它们都不起作用。

答案1

您可以使用语法 ${variable:offset:length} 来获取变量的部分,如下所示:

if [[ ${filemsgCICS:0:4} = "&red" || ${filemsgCICSU1:0:4} = "&red" || \
  ${snufmsgCICS:0:4} = "&red" || ${snufmsgCICSU1:0:4} = "&red" ]]; then

编辑:我关于 * 与 [[ ]] 不匹配的评论是错误的。如果变量包含预期的文本,您的方法也应该有效。所以这只是一种替代方法。

答案2

您可以使用awkandfor循环:

matched=0
for var in "$filemsgCICS" "$filemsgCICSU1" "$snufmsgCICS" "$snufmsgCICSU1";do
   if [ ! -z "$(printf "%s\n" "$var" | awk '/^\&red/')" ]; then
       matched=1
       break
   fi
done
if [ "$matched" -eq 1 ]; then
   # do stuff...
fi

这通过在第一个匹配的变量处跳出循环来实现逻辑 OR 语义。您仍然可以awk仅使用类似的东西来实现这一点

if    [ ! -z "$(printf "%s\n" "$filemsgCICS" | awk ...)" ]\
   || [ ! -z "$(printf "%s\n" "$filemsgCICSU1" ...

但在我看来,使用循环使其更具可读性并且更易于维护。

相关内容