Вам не нужно sed
для удаления не -буквенных символов из значения переменной в bash
. Простая замена переменной сделает то же самое:
PROJECT_DB_NAME=${var//[![:alpha:]]}
Если вы хотите использовать [!a-zA-Z]
вместо [![:alpha:]
, то это, конечно, также возможно.
Если вы действительно хотите использовать внешнюю команду для удаления этих символов, используйте более легкий -вес tr
, а не sed
. Задача tr
как раз и состоит в том, чтобы делать такие вещи, как эти (односимвольные транслитерации ).
PROJECT_DB_NAME=$( tr -dc '[:alpha:]' <<<"$var" )
или,
PROJECT_DB_NAME=$( printf '%s\n' "$var" | tr -dc '[:alpha:]' )
См. руководство по команде tr
.
Обратите внимание, что использование echo
может изменить содержимое переменной до того, как sed
ее увидит. См. вопрос "Почему printf лучше, чем echo? ".
Ваш первый фрагмент кода,
PROJECT_DB_NAME=`sed -i "${var}"'s/[^a-zA-Z]//g'`
запустит sed
без имени файла. Это заставляет sed
предположить, что данные поступают через стандартный ввод. Опция -i
, как говорится в сообщении об ошибке, не может использоваться со стандартным вводом. Кроме того, вы добавляете перед кодом sed
значение переменной. Это заставит значение переменной интерпретироваться как команды редактирования sed
.
Ваш второй фрагмент кода,
PROJECT_DB_NAME=`"$var" | sed -n 's/[^a-zA-Z]//g'`
Это пытается запустить "$var"
как команду на левой стороне конвейера. Кроме того, вы используете sed -n
, что приведет к тому, что sed
- , а не будут выводить измененные данные по умолчанию.
Вы получаете сообщения об ошибках от RTNETLINK, потому что делаете лишние действия.
Давайте взглянем на вашу первую сетевую строфу:
# The primary network interface
allow-hotplug enp2s0
iface enp2s0 inet static
address 10.10.10.83
gateway 10.10.10.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 10.10.10.1
up route del default gw 10.10.10.1
Вы устанавливаете IP-адрес (и полностью опускаете сетевую маску/сетевой адрес, что является неаккуратным и заставляет систему предполагать, что это /8 из-за адреса 10.
, но если это сработает для вас, пусть будет так ), определите шлюз по умолчанию, а затем сразу же добавьте -вверх, удалив шлюз по умолчанию.
(Почему вы все равно делаете это вместо того, чтобы просто не добавлять шлюз, начинающийся с ?)
Когда вы вызываете ifdown enp2s0
, он просматривает определение интерфейса и пытается удалить шлюз по умолчанию, прежде чем деактивировать интерфейс, потому что так работает ifupdown
, но поскольку вы уже удалили этот маршрут, RTNETLINK сообщает ему, что он не может его найти. маршрут, чтобы удалить его, и процесс завершается сбоем.
То же самое происходит и во второй строфе:
iface wlx0013eff5755b inet static
address 192.168.1.83
gateway 192.168.1.1
# # dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 192.168.1.1
up route add default gw 192.168.1.1
(Опять же, нет сетевой маски, но 192.168.x.x
определяется как набор /24
частных подсетей, поэтому снова система делает предположение. Опять же, я бы рекомендовал быть явным здесь.)
Вы определяете шлюз по умолчанию,а на -up явным образом попытаться добавить шлюз по умолчанию еще раз . RTNETLINK сообщает вам, что этот маршрут уже существует, и сценарий снова дает сбой.
Удалите обе записи up
и запись gateway
первой строфы, и это, вероятно, сработает. Я не могу с уверенностью сказать вам, что он будет делать то, что вы хотите, потому что довольно неясно, что вы на самом деле описываете, а файл interfaces
чертовски неоднозначен, потому что я подозреваю, что вы просто скопировали то, что вам на самом деле не нужно. пытаясь понять.