Я пишу очень простой script, который вызывает другой script, и мне нужно распространять параметры из текущего текущего script в script, который я выполняю.
Например, мое имя script foo.sh
и вызывает bar.sh
foo.sh:
bar $1 $2 $3 $4
Как я могу это сделать без явного указания каждого параметра?
Используйте "$@"
вместо обычного $@
, если вы действительно хотите, чтобы ваши параметры передавались одинаковыми.
Заметим:
$ cat foo.sh
#!/bin/bash
baz.sh $@
$ cat bar.sh
#!/bin/bash
baz.sh "$@"
$ cat baz.sh
#!/bin/bash
echo Received: $1
echo Received: $2
echo Received: $3
echo Received: $4
$ ./foo.sh first second
Received: first
Received: second
Received:
Received:
$ ./foo.sh "one quoted arg"
Received: one
Received: quoted
Received: arg
Received:
$ ./bar.sh first second
Received: first
Received: second
Received:
Received:
$ ./bar.sh "one quoted arg"
Received: one quoted arg
Received:
Received:
Received:
Для bash и других оболочек, похожих на Bourne:
java com.myserver.Program "$@"
$argv:q
будет работать в некоторых вариантах csh.
Используйте "$@"
(работает для всех совместимых с POSIX).
[...], bash содержит переменную $@, которая расширяется до всех параметров командной строки, разделенных пробелами.
От Bash на примере.
$*
. Я верю, что здесь есть историческое развитие; $*
не работал как задумано, поэтому $@
был изобретен, чтобы заменить его; но поскольку правила цитирования являются тем, чем они являются, двойные кавычки вокруг них все еще требуются (или они вернутся к нарушенной семантике $*
).
#!/usr/bin/env bash
while [ "$1" != "" ]; do
echo "Received: ${1}" && shift;
done;
Просто подумал, что это может быть немного более полезно при попытке проверить, как args входят в ваш script
$#
Мой SUN Unix имеет множество ограничений, даже "$ @" не интерпретировался по желанию. Мое обходное решение - ${@}. Например,
#!/bin/ksh
find ./ -type f | xargs grep "${@}"
Кстати, мне пришлось иметь этот конкретный script, потому что мой Unix также не поддерживает grep -r
Я понимаю, что это было хорошо ответили, но здесь сравнение между "$ @" $@ "$ *" и $*
Содержание теста script:
# cat ./test.sh
#!/usr/bin/env bash
echo "================================="
echo "Quoted DOLLAR-AT"
for ARG in "$@"; do
echo $ARG
done
echo "================================="
echo "NOT Quoted DOLLAR-AT"
for ARG in $@; do
echo $ARG
done
echo "================================="
echo "Quoted DOLLAR-STAR"
for ARG in "$*"; do
echo $ARG
done
echo "================================="
echo "NOT Quoted DOLLAR-STAR"
for ARG in $*; do
echo $ARG
done
echo "================================="
Теперь запустите тест script с различными аргументами:
# ./test.sh "arg with space one" "arg2" arg3
=================================
Quoted DOLLAR-AT
arg with space one
arg2
arg3
=================================
NOT Quoted DOLLAR-AT
arg
with
space
one
arg2
arg3
=================================
Quoted DOLLAR-STAR
arg with space one arg2 arg3
=================================
NOT Quoted DOLLAR-STAR
arg
with
space
one
arg2
arg3
=================================
Прекрасно работает, за исключением случаев, когда у вас есть пробелы или экранированные символы. Я не нашел способ захватить аргументы в этом случае и отправить в ssh внутри script.
Это может быть полезно, но так уродливо
_command_opts=$( echo "$@" | awk -F\- 'BEGIN { OFS=" -" } { for (i=2;i<=NF;i++) { gsub(/^[a-z] /,"&@",$i) ; gsub(/ $/,"",$i );gsub (/$/,"@",$i) }; print $0 }' | tr '@' \' )