Как получить все входные данные внутри кавычки в переменную - PullRequest
1 голос
/ 20 июня 2019

Я хочу вставить в переменную все, что отправлю внутрь ".

Например:

check.sh

#!/bin/bash
./b.sh -a "$@"

b.sh:

#!/bin/bash

while getopts ":a:b:c:" opt; do
  case ${opt} in
        a) A="$OPTARG"
;;
        b) B="$OPTARG"
;;
        c) C="$OPTARG"
;;
        :) echo "bla"
exit 1
;;
esac
done

echo "a: $A, b: $B, c: $C"

Прогон № 1: Желаемый результат:

user@host $  ./check.sh -a asd -b "asd|asd -x y" -c asd
a: -a asd -b "asd|asd -x y" -c asd, b: ,c: 

Фактический результат:

user@host $  ./check.sh -a asd -b "asd|asd -x y" -c asd
a: -a, b: , c:

Прогон № 2: Желаемый результат:

user@host $ ./check_params.sh -a asd -b asd|asd -c asd
a: -a asd -b asd|asd -c asd, b: ,c:

Фактический результат:

user@host $ ./check_params.sh -a asd -b asd|asd -c asd
-bash: asd: command not found

1 Ответ

0 голосов
/ 20 июня 2019

Используйте $* вместо $@:

check.sh:

#!/bin/bash
./b.sh -a "$*"

"$*" - это строковое представление всех позиционных параметров, объединенных вместе с переменной $IFS. Принимая во внимание, что $@ расширяется в отдельные аргументы.

Также обратите внимание, что во втором примере вам необходимо использовать символьную строку для кавычек:

./check.sh -a asd -b 'asd|asd' -c asd

Проверьте: в чем разница между «$ @» и «$ *» в Bash?

...