尝试让多个变量跟随另一个变量,但我没有得到 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