알 수없는 인터페이스 ens33

В 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

2
24.03.2018, 19:46
1 ответ

Хорошо, кажется, что интерфейс не "существовал".

Добавьте следующую строку в/etc/network/interfaces:

iface ens33 inet dhcp

Включить (включить):

sudo ifup ens33

Готово:

ping google.com

Ура!

8
27.01.2020, 21:55

Теги

Похожие вопросы