bash
не имеет встроенной поддержки для синтаксического анализа CSV. Вместо этого вы можете использовать ksh93
, который поддерживает синтаксический анализ CSV (по крайней мере, некоторая форма CSV, та, в которой литерал "
вводится как " "
в двойных кавычках) с прочтите -S
:
#! /bin/ksh93 -
while IFS=, read -rSu3 P D ignore; do
./xyz --project "$P" --displayname "${D#*.}"
done 3< file.csv
Или используйте perl
/ python
с соответствующей библиотекой синтаксического анализа CSV, которую вы можете настроить для точного формата вашего CSV. Пример с perl
:
perl -C -MText::CSV -e '
$c = Text::CSV->new;
while (($p, $d) = @{$c->getline(STDIN)}) {
$d =~ s/.*?\.//;
system "./xyz", "--project", $p, "--displayname", $d;
}' < file.csv
Если вы можете гарантировать, что содержимое полей CSV не будет содержать двойных кавычек, запятых или символов новой строки, с оболочками POSIX, такими как bash
, вы можете делать:
tr -d \" < file.csv | while IFS=, read -r p d ignore; do
./xyz --project "$p" --displayname "${d#*.}"
done
$ PATH
- это переменная среды по умолчанию, которая сообщает вашей системе, где найти свои двоичные файлы программы (например, программу find
, которую вы пытаетесь использовать), поэтому вы должны использовать для этого другое имя Переменная. Я держу пари, что вы перезаписываете $ PATH
своей системы, и теперь ваша система не может найти программу find
. Попробуйте это и посмотрите, работает ли это.
ПУТЬ
- это переменная среды, используемая оболочкой для поиска исполняемых файлов. Если вы его отключите или измените, оболочка может не найти такие команды, как find
или cp
.
Было бы лучше, если бы вы использовали в скриптах имена переменных в нижнем регистре. Маловероятно, что они столкнутся с важными переменными среды.
В этом случае вы можете использовать, например, source_dir
и target_dir
, которые имеют дополнительное преимущество, предоставляя читателю немного документации.