bash — очистить параметры скрипта, содержащие знак ‘

#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