Хотя принятый ответ, вероятно, самый красивый, могут быть случаи, когда безопасность очень важна, и она также должна быть хорошо видна из вашего сценария.
В таком случае, во-первых, я бы не использовал bash для этой задачи, но если это нужно сделать по какой-то причине, может быть, лучше избегать этих новых функций массива - словаря, потому что вы не можете быть уверены, как именно они сбежали.
В этом случае старые добрые примитивные решения могут работать:
QS="${QUERY_STRING}"
while [ "${QS}" != "" ]
do
nameval="${QS%%&*}"
QS="${QS#$nameval}"
QS="${QS#&}"
name="${nameval%%=*}"
val="${nameval#$name}"
val="${nameval#=}"
# and here we have $name and $val as names and values
# ...
done
Это перебирает пары имя-значение QUERY_STRING
, и нет способа обойти его любой хитрой escape-последовательностью - "
- очень сильная вещь в bash, за исключением подстановки имени одной переменной, который полностью контролируется нами, ничто не может быть обманутым.
Кроме того, вы можете добавить свой собственный код обработки в "# ...
". Это позволяет вам разрешить только свой собственный, четко определенный (и, в идеале, короткий) список разрешенных имен переменных. Само собой разумеется, LD_PRELOAD
не должен быть одним из них. ; -)
Кроме того, никакие переменные не будут экспортироваться, и будут использоваться исключительно QS
, nameval
, name
и val
.