Проблема с IFS, когда назначенный разделитель присутствует дважды. Один раз в середине строки и один раз в конце

Что вы сделали, чтобы сделать Arch видимым для GRUB Ubuntu?

Вы редактировали папку Ubuntu /etc/grub.d/40_customили добавляли другой файл в папку Ubuntu /etc/grub.d/? Тогда этот файл, скорее всего, будет содержать фактические параметры ядра, используемые при загрузке Arch; отредактируйте этот файл, затем запустите sudo update-grubв Ubuntu.

Или загрузочная запись для Arch появлялась автоматически при запуске sudo update-grubв Ubuntu? В этом случае скрипт os-prober(, вызванный /etc/grub.d/30_os-proberнаsudo update-grub)в Ubuntu, может автоматически -обнаруживать установку Arch :, он на самом деле ищет /boot/grub/grub.cfgв любой другой установке Linux. он находит, поэтому, если вы сделаете его в Arch, а затем запустите sudo update-grubв Ubuntu, он может фактически подобрать любые параметры загрузки ядра, указанные в этом файле, на стороне Arch,даже если в Arch не установлена ​​«настоящая» вторая копия GRUB. Может быть достаточно иметь файл конфигурации GRUB в ожидаемом месте.

1
13.05.2020, 13:52
2 ответа

Надежное и переносимое решение должно :использовать переменную и соответствующую ей переменную (Parameter? )расширения.

str="fram-saml-idp-signing-certificate=MIIDYTCCAkmifzlwq5yziqyU04eP4wLr3cM="

key=${str%%=*}        # select the string up to the first =
value=${str#"$key="}  # take all that is not the variable above.

echo "KEY: ${key}";echo "VALUE: ${value}"

Работает во всех оболочках Bourne (ksh, bash, zsh, кроме самой старой оболочки Bourne ).


Детали

Правила для «Разбиения слов» весьма византийские (читайте ссылки по теме ниже для деталей, много «особых случаев» ).

Два (или более )завершающих разделителя удаляются не во всех оболочках. Но один завершающий разделитель удаляется в dash, bash и ksh (, но zsh не удаляет его ).

Альтернатива.

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

str='fram-saml-idp-signing-certificate=MIIDYTCCAkmifzlwq5yziqyU04eP4wLr3cM='

re='^([^=]*)=(.*)';
[[ $str =~ $re ]] && key="${BASH_REMATCH[1]}" value="${BASH_REMATCH[2]}";
echo "KEY: ${key}";echo "VALUE: ${value}"

Что будет (правильно )печатать:

KEY: fram-saml-idp-signing-certificate
VALUE: MIIDYTCCAkmifzlwq5yziqyU04eP4wLr3cM=

Похожие

2
28.04.2021, 23:14

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

Если имеется более одного завершающего разделителя, все зависит от обстоятельств, и сомнительно, можно ли ожидать определенного поведения.

  • Bourne Shell, ksh88, POSIX-варианты ksh88и boshвключают разделители в последнюю переменную только в том случае, если за ними следует не -пустое поле.

  • ksh93и bashвключают немодифицированную остальную часть ввода, если имеется более одного завершающего разделителя.

Заявления POSIX:

If there are fewer vars than fields, the last var shall
be set to a value comprising the following elements:

, но не объясняет, считается ли пустое поле между двумя разделителями полем. Итак, насколько я понимаю, поведение ksh88и ksh93может быть правильным, и по этой причине точное поведение кажется неопределенным.

2
28.04.2021, 23:14

Теги

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