複数の変数が異なる変数に従うことを試みますが、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
(またはでは動作が異なりますbash
。これは$nme
略語にすぎません${nme[0]}
。)
接続許可^
に追加されました$^nme
分散化配列の各要素に。
これは^
(not)演算子を連想させ、zshの変数拡張演算子の起源をrc
説明できます。存在する:^
^
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
実際に使用することに慣れる必要があります。)は単なるプレースホルダではなく、次のプレースホルダを1行に表示するだけです。
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