Поместите несколько переменных после другой переменной

Попытка иметь множественную переменную следовать за другой переменной, но я не получаю 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 

One Solution collect form web for “Поместите несколько переменных после другой переменной”

В 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 's (не) -оператор и, возможно, объясняет происхождение этого оператора zz переменной разложения. В 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 
  • Почему расширение файла glob не подавляется
  • В чем разница между точкой с запятой и двойным амперсандом &&
  • На какой поток xsel печатает предупреждение noline?
  • Внедрить собственную оболочку
  • Как я могу передать stdout в другую программу?
  • Почему в моем Ubuntu 14.04 bash используется оболочка по умолчанию?
  • Существует ли эффективное решение для ошибки i965, влияющей на libEGL?
  • Замените несколько пробелов одним, используя только «tr»
  • vi: переместить строку на 4 байта
  • Меньше знака после выполнения в сценарии оболочки
  • Почему я должен избегать циклов в оболочках?
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.