Если вы используете bash
, вы можете сделать что-то вроде этого (с дополнительными echo
операторами, чтобы показать, что происходит на каждом этапе):
$ line=dog,/path1,/path2
$ newline=$(printf "%s\n" "$line" |
perl -n -e 'BEGIN {$count=1};
my ($var,@values) = split /,/;
print "$var=" . join(",",@values);
foreach (@values) {
printf "%s%i=\"%s\" ",$var, $count++, $_
}')
$ echo "$newline"
dog=/path1,/path2 dog1=/path1 dog2=/path2
$ declare $newline
$ declare | grep '^dog'
dog=/path1,/path2
dog1=/path1
dog2=/path2
Это использует perl
для разделения $line
запятыми. Первое поле сохраняется в $var
, остальные - в массиве @values
. Затем он производит вывод, пригодный для использования с командой bash declare
для установки переменных.
Обратите внимание, что $newline
в строке declare
не заключается и не должен заключаться в двойные кавычки. Если она будет заключена в двойные кавычки, declare
получит только один аргумент, а не три, разделенные пробелами.
Одним из неприятных побочных эффектов отсутствия кавычек здесь является то, что declare
WILL не работает, если любое из значений поля содержит пробелы и т.д. Например, line=dog,/path /with / spaces,/path2
. При необходимости это можно исправить, выводя соответствующие цитаты из операторов print
и printf
в скрипте perl
. И/или определив $newline
как массив bash вместо строки. Оставим это упражнение для читателя, так как я уже достаточно показал принцип/технику, используемую здесь.
Если вы хотите объявить их как экспортируемые переменные, используйте:
declare -x $newline
подробнее см. в help declare
.
BTW, в ksh
вы можете использовать typeset
вместо declare
. typeset
также поддерживается bash
, но считается устаревшим (см. help typeset
в bash
).
И наконец: вы уверены, что не предпочли бы использовать переменную массива shell (например, dog[0]=/path1,/path2
, dog[1]=/path1
, и dog[2]=/path2
), а не отдельные переменные?
Именно для таких вещей они и существуют.
Мой личный фаворит:
Программный raid1 защищает вас от сетевых сбоев, так что том ВСЕГДА активен, пока один диск в порядке. Программный raid автоматически синхронизирует содержимое между дисками, поэтому у вас всегда есть актуальные данные. Получить данные с диска несложно, поскольку raid1 является зеркалом. Тем не менее, вам необходимо как можно скорее заменить неисправный диск.
Резервные копии защищают вас от ошибок «уп-и-удалил-важный-файл».
Помните: если данные не копируются, это не важно ...
RAID1 уничтожит все, если вы сделаете ошибку или вирус решит уничтожить ваши файлы.
Но это позволяет легко исправить фактические сбои жесткого диска.
rsync вызовет простои в (очень частом) случае, когда ваш основной жесткий диск выходит из строя, потому что вам нужно перенести данные обратно (или, по крайней мере, заменить диски).
Но это упрощает восстановление после проблем, вызванных программным обеспечением.
Для «обычного» домашнего использования я бы всегда использовал rsync или другое решение для резервного копирования, в основном потому, что вы обычно не хотите тратить деньги на три жестких диска (один из которых доступен по сети), все с такое же содержание на нем.
Во всем остальном, конечно, правильный ответ: и то, и другое!