将多个变量放在另一个变量之后

将多个变量放在另一个变量之后

尝试让多个变量跟随另一个变量,但我没有得到 7 个不同的 VOL 变量。

NME=(Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1)
VOL=/Volumes/${NME}

for Copy in $VOL ; do
    echo $Copy
done

答案1

zsh(因为你似乎正在使用zsh语法),你会这样做:

nme=(Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1)
vol=(/Volumes/$^nme)
for Copy in $vol; do
  printf '%s\n' $Copy
done

如果没有^,将与数组的值/Volumes/$nme串联,因此只有第一个元素会添加到它前面。/Volumes//Volumes/

或者,当像您一样分配给标量变量而不是数组变量时,它将/Volumes/与用 的第一个字符连接的数组元素连接起来$IFS

ksh(请注意, or中的行为会有所不同bash,其中$nme只是 的缩写${nme[0]})。

添加^$^nme允许串联分散式到数组的每个元素。

^让人想起 的(非)运算rc符,并可能解释了zsh 变量扩展运算符^的起源。^rc

nme=(Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1)
vol=(/Volumes/^$nme)
for (Copy in $vol) printf '%s\n' $Copy

^是不需要的。vol=(/Volumes/$nme)效果是一样的。这里的要点是确实rc分布了串联。然而^(它只是被忽略和丢弃)可以被视为串联运算符因为它有助于诸如$nme^2$nme2将被视为 nme2 变量,否则您需要编写它$'nme'2)之类的事情。

bash(也适用于zsh):

nme=(Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1)
vol=("${nme[@]/#//Volumes/}")
for Copy in "${vol[@]}"; do
  printf '%s\n' "$Copy"
done

在这里,我们使用参数前导模式替换运算符 ( ${param/#pattern/replacement}) 应用于数组的每个元素。在这里,我们将每个元素开头的空字符串替换为/Volumes/)。

虽然该语法来自ksh93,但它不起作用,ksh93因为它不喜欢那种空模式。在那里,您需要将${nme[@]/#//Volumes/}上面替换为${nme[@]/#@()//Volumes/}例如。@()是一个空组。

当然,在标准sh语法中,您始终可以这样做:

set Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1
for Copy do
  printf '/Volumes/%s\n' "$Copy"
done

或者:

set Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1
for Copy do
  Copy=/Volumes/$Copy
  printf '%s\n' "$Copy"
done

或者如果假设你的echo你真的应该习惯printf使用) 不仅仅是一个占位符,您所需要做的就是每行显示这些占位符:

set Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1
printf '/Volumes/%s\n' "$@"

或者:

printf '/Volumes/%s\n' Y6T1 Y6-T1 Y6.T1 Yr6T1 Yr6-T1 Yr6.T1 Yr6Term1

相关内容