Bash script для приема и повторения цитируемых параметров
Я пытаюсь получить цитированные параметры bash script, чтобы безопасно получить вложенный script. Любые идеи?
test.sh
#!/bin/bash
echo $*
bash myecho.sh $*
myecho.sh
#!/bin/bash
echo $1
echo $2
echo $3
echo $4
Пример:
bash test.sh aaa bbb '"ccc ddd"'
Результат:
aaa bbb "ccc ddd"
aaa
bbb
"ccc
ddd"
Требуемый результат
aaa bbb "ccc ddd"
aaa
bbb
ccc ddd
Ответы
Ответ 1
#!/bin/bash
echo $*
bash myecho.sh "[email protected]"
Обратите внимание: конструкция "$ @" не имеет значения bash и должна работать с любой оболочкой POSIX (по крайней мере, с тире). Также обратите внимание, что, учитывая желаемый результат, вам не нужен дополнительный уровень цитирования. И.Е. просто позвоните выше script, как:
./test.sh 1 2 "3 4"
Ответ 2
Вы хотите использовать "$ @" (с котировкой доллар в) для передачи параметров в индекс. Вот так....
ls-color.sh:
#!/bin/bash
/bin/ls --color=auto "[email protected]" # passes though all CLI-args to 'ls'
Что касается того, почему.....
На странице Bash:
$*
- расширяется до позиционных параметров, начиная с единицы. когда расширение происходит в двойных кавычках, оно расширяется до одного слова со значением каждого параметра, разделенным первым символом специальная переменная IFS. То есть, "$*"
эквивалентно "$1c$2c..."
, где c - первый символ значения IFS переменная. Если IFS не задано, параметры разделяются пробелами. Если IFS имеет значение null, параметры объединяются без промежуточных разделителей.
[email protected]
- Расширяется до позиционных параметров, начиная с одного. когда расширение происходит в двойных кавычках, каждый параметр расширяется до отдельное слово. То есть "[email protected]"
эквивалентно "$1" "$2" ...
Если двойное кавычное расширение происходит внутри слова, расширение первый параметр соединяется с начальной частью оригинала слово, а расширение последнего параметра соединяется с последним часть оригинального слова. Когда нет позиционных параметров, "[email protected]"
и [email protected]
расширяются до нуля (т.е. удаляются).
Настройка некоторых демо-скриптов...
echo 'echo -e "\$1=$1\n\$2=$2\n\$3=$3\n\$4=$4"' > echo-params.sh
echo './echo-params.sh $*' > dollar-star.sh
echo './echo-params.sh [email protected]' > dollar-at.sh
echo './echo-params.sh "$*"' > quoted-dollar-star.sh
echo './echo-params.sh "[email protected]"' > quoted-dollar-at.sh
chmod +x *.sh
"[email protected]"
- quoted-dollar-at - это преобразование идентичности для повторного прохождения аргументов к подоболочке (~ 99% времени, это то, что вы хотели сделать):
./quoted-dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa
# $2=
# $3= 'cc cc'
# $4= "ddd ddd"
"$*"
- quoted-dollar-star разбивает args на одну строку (~ 1% времени, когда вы действительно хотите это поведение, например, в условном: if [[ -z "$*" ]]; then ...
):
./quoted-dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa 'cc cc' "ddd ddd"
# $2=
# $3=
# $4=
$*
/[email protected]
- без кавычек обе формы отделяют один уровень цитаты и интерпретируют пробелы от базовых строк, но игнорируют символы котировки (почти всегда это ошибка):
./dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa
# $2= 'cc
# $3= cc'
# $4= "ddd
./dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa
# $2= 'cc
# $3= cc'
# $4= "ddd
Если вы хотите повеселиться, вы можете использовать "$ @" для того, чтобы вложить вещи так глубоко, как вам хотелось бы, нажав и выталкивая элементы из стека args, если хотите.
function identity() {
"[email protected]"
}
set -x
identity identity identity identity identity echo Hello \"World\"
# + identity identity identity identity identity echo Hello '"World"'
# + identity identity identity identity echo Hello '"World"'
# + identity identity identity echo Hello '"World"'
# + identity identity echo Hello '"World"'
# + identity echo Hello '"World"'
# + echo Hello '"World"'
# Hello "World"