Я пишу дуже простий сценарій, який викликає інший сценарій, і мені потрібно розподілити параметри з мого поточного сценарію до сценарію, який я виконую.
Наприклад, моє ім'я сценарію - foo.sh
і дзвінки bar.sh
foo.sh:
bar $1 $2 $3 $4
Як я можу це зробити, не вказавши явно кожен параметр?
Відповіді:
952 за відповідь №1Використовуйте "$@"
замість рівнини $@
якщо ви насправді бажаєте, щоб ваші параметри передавалися однаково.
Спостерігати:
$ 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:
453 для відповіді №2
Для баш та інші оболонки, подібні до Борна:
java com.myserver.Program "$@"
72 за відповідь № 3
Використовуйте "$@"
(працює для всіх POSIX сумісні).
[...], bash містить змінну "$ @", яка розширюється до всіх параметрів командного рядка, розділених пробілами.
Від Баш на прикладі.
24 за відповідь № 4
#!/usr/bin/env bash
while [ "$1" != "" ]; do
echo "Received: ${1}" && shift;
done;
Просто подумав, що це може бути трохи корисніше при спробі перевірити, як аргументи потрапляють у ваш сценарій
12 за відповіддю № 5
Я розумію, що на це добре відповіли, але тут є порівняння між "$ @" $ @ "$ *" та $ *
Зміст сценарію тесту:
# 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 "================================="
Тепер запустіть тестовий сценарій з різними аргументами:
# ./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
=================================
5 для відповіді № 6
Мій SUN Unix має багато обмежень, навіть "$ @" не трактується як бажано. Моє рішення: $ {@}. Наприклад,
#!/bin/ksh
find ./ -type f | xargs grep "${@}"
До речі, мені довелося мати саме цей сценарій, оскільки мій Unix також не підтримує grep -r
1 для відповіді № 7
Працює нормально, за винятком випадків, коли у вас є пробіли або символи, що втекли Я не знаходжу способу фіксувати аргументи в цьому випадку і надсилати їх до ssh всередині сценарію.
Це може бути корисно, але настільки негарно
_command_opts=$( echo "$@" | awk -F- "BEGIN { OFS=" -" } { for (i=2;i<=NF;i++) { gsub(/^[a-z] /,"&@",$i) ; gsub(/ $/,"",$i );gsub (/$/,"@",$i) }; print $0 }" | tr "@" " )
0 для відповіді № 8
Якщо ви включите $@
у рядку з цитатами з іншими символами поведінка дуже дивна, коли є кілька аргументів, лише перший аргумент включається в лапки.
Приклад:
#!/bin/bash
set -x
bash -c "true foo $@"
Прибутковість:
$ bash test.sh bar baz
+ bash -c "true foo bar" baz
Але призначивши спочатку іншу змінну:
#!/bin/bash
set -x
args="$@"
bash -c "true foo $args"
Прибутковість:
$ bash test.sh bar baz
+ args="bar baz"
+ bash -c "true foo bar baz"