#linux #string #bash #parameter-passing #sanitization
#linux #строка #bash #передача параметров #очистка
Вопрос:
Я пишу скрипт bash и пытаюсь выполнить обработку ошибок и очистку предоставленных параметров скрипта. Предоставленные параметры имеют форму пар ключ / значение и разделены символом «amp;» для обеспечения совместимости с API:
cluster=xyzamp;tenant=abcd1234amp;key1=value1amp;key2=value2
В простейшей форме, просто для распечатки предоставленного параметра, этот скрипт состоит всего из двух строк:
#!/bin/bash
echo "The supplied parameter"
echo "$1"
При вызове скрипта с параметрами в одинарных или двойных кавычках все работает, как ожидалось:
$./script.sh 'cluster=xyzamp;tenant=abcd1234amp;key1=value1amp;key2=value2'
The supplied parameters
cluster=xyzamp;tenant=abcd1234amp;key1=value1amp;key2=value2
$./script.sh "cluster=xyzamp;tenant=abcd1234amp;key1=value1amp;key2=value2"
The supplied parameters
cluster=xyzamp;tenant=abcd1234amp;key1=value1amp;key2=value2
Однако, если я не заключаю строку в одинарные / двойные кавычки, это приводит к зависанию скрипта:
$ ./script.sh cluster=xyzamp;tenant=abcd1234amp;key1=value1amp;key2=value2
[1] 1080
[2] 1081
[3] 1082
[2] Done tenant=abcd1234
[3] Done key1=value1
$ The supplied parameters
cluster=xyz
И выше остается, пока я не нажму ctrl c.
Мой вопрос — как правильно очистить строку, если она НЕ заключена в одинарные / двойные кавычки, и предотвратить возникновение вышеуказанного?
Версия Bash — GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)
Спасибо.
Комментарии:
1. Вы ничего не можете с этим поделать из своего скрипта — «повреждение» уже сделано до его вызова. Вам нужно убедиться, что все, что вызывает ваш скрипт, правильно заключено в кавычки
2. Я знаю, что bash по своей сути опасен… Значит, нет другого способа, кроме как заключить его в кавычки или разделить пары ключ / значение пробелами?
3.
amp;
является специальным символом для bash (и многих других оболочек). Он интерпретируется при вводе команды перед запуском вашего скрипта. Читатьman bash
.4. Когда
amp;
происходит как часть командной строки оболочки вне кавычек и без выделения, это разделитель между командами (который выполняет команду перед ее запуском в фоновом режиме). Это базовый синтаксис оболочки, и вы не можете создать команду, которая не соответствует синтаксису оболочки.
Ответ №1:
Кажется, есть только два способа решения проблемы
Вариант 1 — один параметр в виде строки, содержащий знаки ‘amp;’
Необходимо убедиться, что предоставленная строка параметров заключена в одинарные или двойные кавычки.
Вариант 2 — полностью избавиться от символа ‘amp;’ и интерпретировать несколько предоставленных параметров
Скрипт должен вызываться с несколькими параметрами ключа / значения, разделенными пробелом:
./script.sh cluster=xyz tenant=abcd1234 key1=value1 key2=value2