Bash: сопоставление подстрок в строке и извлечение пар ключ-значение

Я бы разбил его на отдельные функции, что позволило бы мне проверить подключение к Wi-Fi перед перенастройкой сети.

#!/usr/bin/env bash
CONF="/etc/wpa_supplicant/wpa_supplicant.conf"

function connect_wifi() {
    wpa_supplicant -B -i wlan0 -c $CONF >/dev/null 2>&1
}

function connect_tcpip() {
    service ntp restart
    ip link set dev wlan0 down
    ip link set dev wlan0 up
    dhclient wlan0
}

FUNC_CW=$(declare -f connect_wifi)
FUNC_CT=$(declare -f connect_tcpip)

if (sudo bash -c "$FUNC_CW; connect_wifi"); then
    sudo bash -c "$FUNC_CT; connect_tcpip"
else
    echo "Error Connecting to Wifi.  Please check your credentials and try again."
fi
0
28.01.2020, 23:47
2 ответа

Если вы не возражаете против использования нескольких шагов, вы можете сделать это полностью с помощью bashвстроенных -модулей

x='final old-version=1.2.3-old new-version=1.2.4'

oldnew=${x#* }          # "old-version=1.2.3-old new-version=1.2.4"
old=${oldnew% *}        # "old-version=1.2.3-old"
new=${oldnew#* }        # "new-version=1.2.4"

oldversion=${old#*=}    # "1.2.3-old"
newversion=${new#*=}    # "1.2.4"

echo "Old version is >$oldversion<"
echo "New version is >$newversion<"

В качестве двух примеров операторов #и %

  • конструкция ${x#* }удаляет строку, совпадающую с шаблоном *{space}, из начала строки $x.
  • конструкция ${oldnew% *}удаляет строку, совпадающую с glob {space}*, из конца строки

Вот еще одна версия, значительно короче, с использованием массива для нарезки переменной $xпо пробелу

x='final old-version=1.2.3-old new-version=1.2.4'

oldnew=($x)                   # array ('final', 'old-version=1.2.3-old', 'new-version=1.2.4')
oldversion=${oldnew[1]#*=}    # "1.2.3-old"
newversion=${oldnew[2]#*=}    # "1.2.4"

echo "Old version is >$oldversion<"
echo "New version is >$newversion<"
1
28.04.2021, 23:25

с использованием оболочки bash и P.E. раскрытие и чтение параметров

x='final old-version=1.2.3-old new-version=1.2.4'
read -r _ old new <<< "$x"; printf '%s\n' "${old#*=}" "${new#*=}"

или используя массив с опцией -aиз чтения.

x='final old-version=1.2.3-old new-version=1.2.4'
read -ra var <<< "$x"; printf '%s\n' "${var[1]#*=}" "${var[2]#*=}"
1
28.04.2021, 23:25

Теги

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