Bash多行定义EXCEPTLIST变量及@(${})语法含义咨询
问题解答
一、多行定义EXCEPTLIST变量的可行方式
当需要维护大量服务器名称时,完全可以用多行方式定义EXCEPTLIST,以下是两种可靠实现:
1. 反斜杠续行法
用反斜杠\标记行延续,注意反斜杠后必须直接跟换行(不能有多余空格),最终变量会自动合并为单行竖线分隔的字符串:
EXCEPTLIST="desktop-01|desktop-02|desktop-03| \ desktop-04|desktop-05|desktop-06| \ desktop-07|desktop-08"
这种方式和单行定义效果完全一致,只是排版更易读。
2. 数组转字符串法(更推荐)
如果条目数量极多,用数组单独存储每个条目再转换为竖线分隔的字符串,维护性更强:
# 数组每行存储一个服务器名,无需关心分隔符 EXCEPTLIST_ARRAY=( desktop-01 desktop-02 desktop-03 desktop-04 desktop-05 desktop-06 desktop-07 desktop-08 ) # 将数组元素用|连接生成目标字符串 EXCEPTLIST=$(printf "%s|" "${EXCEPTLIST_ARRAY[@]}") # 移除最后一个多余的|符号 EXCEPTLIST=${EXCEPTLIST%|}
这种方式修改条目时无需调整分隔符,不容易出错。
二、@(...)语法的术语与原理
术语名称
这个语法不属于变量展开,它是Bash的**扩展模式(Extended Pattern Matching)**中的一种,具体称为“可选模式列表”。
工作原理
在[[ ]]条件判断结构中,Bash支持扩展模式匹配。@(pattern1|pattern2|...)表示匹配竖线分隔的任意一个模式。
你的代码中:
if [[ $vmname != @(${EXCEPTLIST}) ]]; then
执行流程为:
- 先完成
${EXCEPTLIST}的变量展开,得到desktop-01|desktop-02|...的字符串; @(...)将展开后的字符串解析为多个可选匹配模式;- 条件判断
$vmname是否不等于这些模式中的任意一个,从而实现“不在排除列表”的逻辑。
补充说明
- 扩展模式默认通常已开启,若未启用可通过
shopt -s extglob命令开启; - 扩展模式还包括其他语法:
*(...)(匹配零次或多次)、+(...)(匹配一次或多次)、?(...)(匹配零次或一次)、!(...)(匹配除指定模式外的任意内容)。
内容的提问来源于stack exchange,提问作者SAGAR BHOOSHAN
相关产品推荐
相关产品推荐

