Изменение файла со значениями из другого файла — сценарий Bash

Во-первых, если вы не знаете, с чем играете, вы рискуете своими данными. Хотя я думаю, что вы не слишком далеко, чтобы знать это достаточно хорошо.

Если ваш второй раздел (, который находится на sdc ), полностью свободен, вы можете удалить его. Делайте это, только если он действительно пуст!!!

Во-первых, вы можете исключить расширение vg hana2 -.

vgchange -an hana2-extend

Теперь расширение хана2 -отключено.

Вы -создаете на нем физический том:

pycreate /dev/sdc

...и вы можете добавить в исходную группу томов, hana2:

vgextend hana2 /dev/sdc

Теперь у вас есть только одна группа томов, hana2, которая использует ваши жесткие диски sdb и sdc.

На следующем шаге вы можете расширить логический том hanalv на всю группу томов:

lvextend -n hanalv -L <extentnum>

...где экстентнум — это общее количество экстентов в текущей группе томов hana2. Вы можете получить это с помощью команды vgdisplay hana2.

Теперь, когда раздел стал достаточно большим, вы можете изменить размер файловой системы на нем.:

resize2fs /dev/hana2/hanalv

...и так оно и есть. Вы можете сделать последний шаг даже без размонтирования файловой системы, потому что ext4 умен и его можно вырастить онлайн.

Еще раз :делайте это только после того, как вы сделали резервную копию всего.

1
10.12.2019, 19:56
1 ответ
  1. Вам не нужно читать CSV в переменные, вы можете просто зациклить CSV напрямую:
cat data.csv | while IFS=, read id colour; do # something with $id and $colour
  1. Выполнение var=$(echo text)несколько избыточно, -вы должны просто использовать var="text"напрямую.

  2. Я не уверен, что вы подразумеваете под конструкцией [ "grep -E..." ], но в основном это проверка того, не является ли строка в тесте пустой, а это не так, потому что вы просто помещаете в нее какой-то текст.

При написании bash-скриптов рекомендуется тестировать каждое выражение по очереди и видеть, что оно ведет себя так, как вы ожидаете, из командной строки (*)-, таким образом будет устранено много неожиданностей. Написание полного сценария, а затем его запуск без большого опыта в том, как писать сценарии хорошо, вероятно, является хорошим способом выстрелить себе в ногу. У меня многолетний опыт написания bash-скриптов, и я до сих пор много раз терплю неудачу в командной строке, прежде чем писать сценарий. Когда вы запускаете свой скрипт, запуск его с -xдля включения трассировки команд окажется очень полезным.

Я полагаю, что основная причина, по которой замена не работает, заключается в том, что файл SVG использует двойные кавычки(")для атрибута ID, а не одинарные кавычки, как в вашем выражении sed.

При конструировании sedвыражений в сценарии оболочки часто надоедает иметь дело с экранированием. Если возможно, я обычно предпочитаю, чтобы выражение sedвообще не заключалось в кавычки, что является одной из причин, по которой я часто использую разделители регулярных выражений, которые не являются косой чертой (, как мы увидим далее ).Вам нужно ввести значения idи colourв выражение sed, а также правильно определить цитирование атрибутов SVG. Одна вещь, которая может сработать, это:

sed -i "s,id=\"$id\",id=\"$id\" style=\"fill:$colour;\"," "$1"

Здесь мы просто использовали двойные кавычки вокруг выражения -, что позволяет нам вставлять переменные -и просто экранировать двойные кавычки, чтобы они не завершали строку оболочки.

Другим вариантом может быть составление выражения sedиз нескольких строк с разными правилами цитирования:

sed -i 's,id="'"$id"'",id="'"$id"'" style="fill:'"$colour"';",' "$1"

Здесь мы помещаем весь статический текст в одинарные кавычки, а затем просто завершаем одинарные кавычки и открываем строку в двойных кавычках для анализа переменных. Это работает, потому что между строками в одинарных кавычках и строками в двойных кавычках нет пробелов, и пока пробелов нет, Bash передает все это как один аргумент в sed. Но очевидно, что это немного сбивает с толку, поэтому я предпочитаю первый стиль.

Еще одна вещь, которую мы можем сделать, это использовать sedгруппы захвата, чтобы не вводить id="$id"более одного раза:

sed -i "s,\(id=\"$id\"\),\1 style=\"fill:$colour;\"," "$1"

\(и \)захватывают совпавшую вещь и \1возвращают ее обратно в подставленную строку. *)Если вы выполняли сценарии в MS -Windows, вы, вероятно, знаете о печальной печальной ситуации, когда командная строка (, будь то CMD или powershell ), ведет себя иначе, чем выполнение тех же команд в сценариях, часто неочевидными -способами. Это , а не ситуация в оболочках сценариев Unix, таких как Bash.

2
27.01.2020, 23:29

Теги

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