Почему это не работает
Вы неправильно используете цитирование в оболочке.
Вы не можете вкладывать двойные кавычки, как вы ("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]'
И если вы запустите вывод в виде команды, то одинарные кавычки ('
) будут работать и работать правильно.