我正在尝试检查 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
您可以使用awk
andfor
循环:
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" ...
但在我看来,使用循环使其更具可读性并且更易于维护。