Сценарий Bash :Добавить/удалить комментарий к совпадающим строкам

UUID="14314872-abd5-24e7-a850-db36fab2c6a1" /lpo/sda ext4 defaults,noatime 0 0
UUID="6d439357-3d20-48de-9973-3afb2a325eee" /lpo/sdb ext4 defaults,noatime 0 0

Формат записей в fstab следующий:

<file system>   <dir>   <type>  <options>   <dump>  <pass>

Где <file system>— это устройство, которое вы хотите смонтировать (, например /dev/sdb, а <dir>— это путь к месту, куда должно быть смонтировано устройство(/lpo/sdaв вашем случае ).

Существует несколько способов указать <file system>, самый простой из которых — это путь к рассматриваемому устройству файловой системы /dev/sdbв вашем случае (, хотя обычно они указывают на раздел на диске, а не на диск, например /dev/sdb1, но похоже, что на ваших дисках нет таблицы разделов и просто есть файловая система на основном устройстве ). Но вы также можете использовать устройство UUIDили PARTUUID, указав его как пару ключ/значение UUID="14314872-abd5-24e7-a850-db36fab2c6a1"вместо /dev/sdb.

Основная причина использования UUIDили PARTUUIDвместо путей к устройствам заключается в том, что они более согласованы при смене физических дисков. Устройства пронумерованы в соответствии с тем, как они представлены операционной системе биосом (, который обычно упорядочен по сокету, к которому они подключены ). Это означает, что если вы добавите новое устройство или физически переупорядочите существующие устройства, они будут перенумерованы, и то, что было раньше /dev/sdb, может не быть сейчас. Как вы можете себе представить, это приведет к тому, что неправильный диск будет смонтирован в неправильном месте.UUIDи PARTUUID— это идентификаторы, которые записываются как часть форматирования файловой системы для UUIDили во время создания раздела в случае PARTUUID. Эти номера записываются на диск и всегда остаются неизменными, поэтому их можно использовать для монтирования правильного диска, даже если базовый файл устройства будет перенумерован.

Дополнительное примечание :Ваши устройства немного сбивают с толку -вы установили /dev/sdbна /lpo/sda-, хотя это работает, это может сбивать с толку и приводить к ошибкам при обслуживании/настройке вашей системы, вы можете захотеть сделать их более последовательными.

0
09.09.2020, 17:33
2 ответа

Используемый скрипт следует изменить следующим образом:

if [[ ! -z "$1" && ! -z "$2" && "$2" = "comment" ]]; then
    # remove multi # comments if there's any
    sed -i "s/#*export PATH=\"\/usr\/local\/opt\/php@$1/export PATH=\"\/usr\/local\/opt\/php@$1/g" ~/.zshrc
    # Finally add a single # comment
    sed -i "s/export PATH=\"\/usr\/local\/opt\/php@$1/#export PATH=\"\/usr\/local\/opt\/php@$1/g" ~/.zshrc
fi
if [[ ! -z "$1" && ! -z "$2" && "$2" = "uncomment" ]]; then
    # remove one or more # comments
   sed -i "s/#*export PATH=\"\/usr\/local\/opt\/php@$1/export PATH=\"\/usr\/local\/opt\/php@$1/g" ~/.zshrc
fi

Проблемы были:

  1. Пустые одинарные кавычки('')после sed -i.

  2. Вы не указали входной файл sed(~/.zshrc).

  3. Вам нужно было использовать двойные кавычки(")вместо одинарных ('), чтобы оболочка сначала раскрывала переменную $1. См. этот и этот соответствующие вопросы.

1
18.03.2021, 23:06

Это будет работать надежно, эффективно и портативно.:

#!/usr/bin/env bash

infile=~/.zshrc
tmp=$(mktemp) || exit 1

awk -v ver="$1" -v cmd="$2" '
    index($0,"php@"ver"/") {
        if      ( cmd == "comment" )   { sub(/^#*/,"#") }
        else if ( cmd == "uncomment" ) { sub(/^#+/,"")  }
        else { printf "bad cmd: %s\n", cmd | "cat>&2" }
    }
    { print }
' "$infile" > "$tmp" && mv "$tmp" "$infile"

При необходимости измените "php@"ver"/"на "export PATH=\"/usr/local/opt/php@"ver"/", чтобы избежать ложных совпадений с другими строками, которые существуют в вашем реальном вводе, но не показаны в вашем примере.

Если у вас есть GNU awk, вы можете использовать -i inplaceвместо создания файла tmp вручную.

2
18.03.2021, 23:06

Теги

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