В 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
позволяет распределить конкатенацию на каждый элемент массива.
Этот ^
напоминает 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
Хорошо, кажется, что интерфейс не "существовал".
Добавьте следующую строку в/etc/network/interfaces
:
iface ens33 inet dhcp
Включить (включить):
sudo ifup ens33
Готово:
ping google.com
Ура!