Аргументы с пробелом при разборе входных параметров для скрипта bash

Я написал bash-скрипт, который принимает параметры по имени и считывает их значение в парах ключ-значение. Ниже приведен пример того, как я запускаю свой скрипт.

 sh test.sh param1='a' param2='b'

Затем я ссылаюсь на входные аргументы, такие как $param1 и $param2, внутри своего скрипта. Ниже приведен сценарий, который я написал для этого.

for item in $@; do
case $item in
(*=*) eval $item;;
esac
done

Но когда в значении аргумента есть пробел, он принимает только часть перед пробелом.

 param3='select * from'

назначит 'select' только для param3, а не для всей строки. Как я могу этого добиться? Любая помощь приветствуется.

РЕДАКТИРОВАТЬ :

После ответа Иниана

for item in $@; do
case "$item" in
(*=*) eval "$item";;
esac
done

person AnOldSoul    schedule 10.01.2017    source источник
comment
Рассматривали ли вы вместо этого передачу их в качестве переменных, то есть param1='a' param2='b' sh test.sh вместо этого? Это сделает echo "$param1" доступным сразу без разбора   -  person that other guy    schedule 10.01.2017
comment
Использование $@ или $* без заключения в двойные кавычки не является хорошей идеей. Это будет неправильно, если в ваших строках есть специальные символы, такие как пробелы и подстановочные знаки.   -  person codeforester    schedule 10.01.2017


Ответы (1)


Вы можете сделать это, заключив в кавычки "$@" и используя declare вместо eval:

for item in "$@"; do
case $item in
(*=*) declare "$item" ;;
esac
done

Однако теперь это bash-скрипт, поэтому его нужно запускать с bash test.sh, а не sh test.sh.

person that other guy    schedule 10.01.2017
comment
Это сделало трюк! но, как вы указали в комментарии, в чем разница между указанием параметров после sh ‹scriptName› и перед sh ‹scriptName›? извините, я новичок в этом. - person AnOldSoul; 10.01.2017
comment
@mayooran: если вы укажете их перед командой, они будут интерпретированы как назначения переменных среды вызывающей оболочкой, поэтому они будут напрямую доступны в сценарии. Если вы поместите их после, они будут интерпретированы как строки для передачи в скрипт как $1, $2 и т. д., а затем вам придется сделать что-то нестандартное и странное, чтобы превратить их в назначения переменных. Обычный способ для сценариев принимать аргументы — это либо простые строки в стандартном порядке (например, sh test.sh val1 val2), либо использование параметров - для их указания (например, sh test.st -a val1 -b val2). - person Gordon Davisson; 10.01.2017
comment
@GordonDavisson о, понял, приятель! большое спасибо! :) :) - person AnOldSoul; 10.01.2017