为什么扩展有时会呼应括号,有时却不会?

为什么扩展有时会呼应括号,有时却不会?
$ echo --hidden-import={a,b}
--hidden-import=a --hidden-import=b

相比于

echo --hidden-import={$FILES}
--hidden-import={cpu_mon disk_mon mem_mon network_mon}

FILES创建者

export FILES=$(ls)

在这个例子中我期望得到

--hidden-import=cpu_mon --hidden-import==disk_mon --hidden-import==mem_mon --hidden-import==network_mon

答案1

括号扩展发生在变量扩展之前。如果{$x,$y}shell 先将其处理为两个参数$x$y,然后才分别扩展每个参数中的变量。如果只有一个项目,则根本不会发生括号扩展;{xy}始终只保留{xy}

如果你正在为 Bash 编写,请改用数组和参数扩展:

files=(*)
echo "${files[@]/#/--hidden-import=}"

此处的#in${var/#match/replacement}使其仅在变量开头替换(零长度)匹配字符串。还请注意,使用 来files[@]获取数组的所有元素,而不仅仅是第一个元素。

如果这不起作用,只需使用循环构建参数列表:

args=()
for file in *; do
    args+=("--hidden-import=$file")
done
echo "${args[@]}"

或者,可以使用 Bash 的 printf 一次向多个参数添加前缀/后缀:

printf '--hidden-import=%s\n' * | xargs -d '\n' echo

在最坏的情况下(如果你没有 Bash如果你已经排除了所有其他 CLI 脚本语言(例如 Perl、Python 甚至 PHP),请尝试 sed:

\ls | sed "s/^/--hidden-import=/" | xargs -d '\n' echo

(故意使用反斜杠来绕过别名,例如“ls -F”。)

相关内容