Значение ipv6, присвоенное переменной в скрипте bash, ведет себя неправильно - PullRequest
0 голосов
/ 07 января 2020

Я запустил ситуацию, когда я назначаю переменную с адресом ipv6, а затем пытаюсь выполнить операцию, связав ipv6 с квадратными скобками []. В одном из сценариев ios bash выполняет то, что всегда присутствует внутри [], и заменяет все значение на 1.

Некоторые вещи, такие как

#!/bin/sh
llipv6=xxxx::xxxx:xxxx:xxxx:3a17%bond0
echo "/bin/bash -c "$REST_CLI serverlogs --url [$llipv6]""

Когда я запускаю скрипт выводит

/ bin / bash - c "ab c. sh serverlogs --url 1

Еще одна удивительная вещь, которая здесь происходит то, что, если я изменяю адреса ipv6 последние два di git выше 19, он печатает правильно

llipv6=xxxx::xxxx:xxxx:xxxx:3a21%bond0
echo "/bin/bash -c "$REST_CLI serverlogs --url [$llipv6]""

Выходные данные / bin / bash - c "ab c. sh serverlogs --url [xxxx :: xxxx: xxxx: xxxx: 3a21% bond0]

Я не понимаю проблему здесь.

Я просто изменил способ объединения ipv6, как показано ниже, и он, кажется, работает нормально.

#!/bin/sh
llipv6=xxxx::xxxx:xxxx:xxxx:3a17%bond0
echo "/bin/bash -c "$REST_CLI serverlogs --url "[$llipv6]"""

Пожалуйста, предложите правильный способ сделать это.

Заранее спасибо.

1 Ответ

0 голосов
/ 12 января 2020

Почему это не работает

Вы неправильно используете цитирование в оболочке.

Вы не можете вкладывать двойные кавычки, как вы ("something1 "something2"").

Когда sh видит

echo "/bin/bash -c "$REST_CLI serverlogs --url [$llipv6]""

видит строки /bin/bash -c $REST_CLI, serverlogs, --url, [$llipv6] (с добавленной пустой строкой "", которая ничего не делает).

Теперь, поскольку вы неправильно используете кавычки оболочки, я собираюсь предположить, что вы присвоили REST_CLI таким образом, чтобы оно имело значение "abc.sh (с ведущей двойной кавычкой).

Таким образом, оболочка интерпретирует /bin/bash -c $REST_CLI как /bin/bash -c "abc.sh. Интерпретация serverlogs и --url в порядке. Но затем мы получаем [$llipv6].

В оболочке POSIX синтаксис [some-letters] является шаблоном глобуса. Так же, как * относится к «всему, что завершает имя файла», [abc] относится к «всему, что завершает имя файла с a, b или c».

пример:

$ ls
aaa  bbb  ccc
$ echo [ab]*
aaa bbb

Поэтому, когда оболочка видит [$llipv6], она превращается в [llipv6=xxxx::xxxx:xxxx:xxxx:3a17%bond0], который представляет собой шаблон глобуса, который соответствует каждому файлу, если его имя равно одному из :, %, 0, 1, 3, 7, a, b, d, n, o, x.

Так в каталоге, где вы находитесь при выполнении этого скрипта у вас есть файл с именем 1, поэтому вместо IPv6-адреса в конце вы получаете 1, а также почему, когда вы набираете больше 19, 1 больше не является символ glob.

Затем включается другое тайное поведение оболочки posix. Если шаблон glob не соответствует ни одному файлу, то вместо возврата 0 файлов он возвращает шаблон, в случае «выше 19» - [xxxx::xxxx:xxxx:xxxx:3a21%bond0] - вот почему он работает нормально.

Также обратите внимание, что с вашим измененным способом:

echo "/bin/bash -c "$REST_CLI serverlogs --url "[$llipv6]"""

она видит первые 3 строки в sam e, только теперь он видит "[$llipv6]" в кавычках, а когда он в кавычках, глобализация не применяется, поэтому эта версия также отлично работает.

Как заставить это работать

Относительно вложенного цитирование оболочки, внутри "" вы можете использовать '' для цитирования (и наоборот):

#!/bin/sh
llipv6=xxxx::xxxx:xxxx:xxxx:3a17%bond0
echo "/bin/bash -c '$REST_CLI serverlogs --url [$llipv6]'"

Внутри строки в двойных кавычках ' не имеет особого значения. Вывод:

/bin/bash -c 'abc.sh serverlogs --url [xxxx::xxxx:xxxx:xxxx:3a17%bond0]'

И если вы запустите вывод в виде команды, то одинарные кавычки (') будут работать и работать правильно.

...