Как выполнить итерации через разделенный запятыми список и выполнить команду для каждой записи

Для разработки C/C++ Вам нужен gcc компилятор, который включен в большинство дистрибутивов Linux или может быть легко установлен.

Нет IDE по умолчанию: большинство людей использует своего любимого редактора (энергия, emacs, Geany и т.д....) и существуют IDE как Eclipse или KDevelop доступный.

C# может быть, покончили Моно, но это не полностью совместимо с.NET: проверьте список совместимости.

4
04.02.2019, 14:46
3 ответа

Если Вы уверены, что поля между запятыми не содержат пробелов, чем Вы могли сделать что-то вроде этого:

for job in $(echo $all_jobs | tr "," " "); do
    sendevent -verbose -S NYT -E JOB_OFF_HOLD -J "$job" --owner me
done

Если Вы нуждаетесь в чем-то более устойчивом, смотрите на инструменты, должен был иметь дело с файлами CSV под Unix.

3
27.01.2020, 20:49
  • 1
    это работало отлично (плюс спасибо за ссылку дополнительных материалов для чтения). Это не должно быть особенно устойчиво - это - просто рационализаторское устройство для установки вещей - не производственный код. Еще раз спасибо! –  Ian 06.02.2013, 17:03

Разделение строки в конкретном символе встроено в оболочку на очень глубоком уровне: если Вы пишете $var без любых окружающих кавычек затем это расширено следующим образом:

  1. Примите значение var переменная.
  2. Разделите это значение на список полей. Разделитель полей является любым символом в значении IFS переменная. Если IFS содержит пробельные символы, затем последовательные разделители рассматривают как один; для непробельных символов последовательные разделители приводят к пустым полям.
  3. Выполните globbing, т.е. интерпретируйте каждое получающееся поле как подстановочный шаблон имени файла. Для каждого шаблона, который соответствует одному или нескольким файлам, замените его списком соответствия файлам.

То же происходит для замены команды $(somecommand), за исключением того, что шаг 1, “собирают вывод из выполнения somecommand и разделите все новые строки в конце”.

Избежать всего этого вздора и просто получить точное значение переменной или вывод команды минус заключительные новые строки, убедиться поместить подстановку переменных или замену команды между двойными кавычками: "$foo", "$(foo)".

Для разделения результата команды susbtitution в символах запятой установить IFS=, и оставьте замену незащищенной. Необходимо сделать еще одну вещь: выключите globbing, с set -f (и восстановите его впоследствии с set +f.

all_jobs=$(…)
set -f; IFS=,
for job in $all_jobs; do
  sendevent -verbose -S NYT -E JOB_OFF_HOLD -J "$job" --owner me
done
set =f; unset IFS
6
27.01.2020, 20:49
  • 1
    Спасибо - я пытался использовать IFS, когда я гуглил для решения прежде, чем отправить вопрос, но я думаю, что у меня был синтаксис немного неправильно - благодарит за пример! –  Ian 08.02.2013, 11:24

Можно использовать xargs:

all_jobs="job1,job2,job3"
echo $all_jobs | tr '\n' ' ' | xargs -d, --replace=xx sendevent -verbose -S NYT -E JOB_OFF_HOLD -J xx --owner me

Канал через tr может не быть необходим если $all_jobs не имеет новой строки в конце

0
27.01.2020, 20:49
  • 1
    Спасибо за ответ - определенно найдет этот синтаксис полезным в другом месте. –  Ian 06.02.2013, 17:05

Теги

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