/ / Поширювати всі аргументи у сценарії оболонки bash - bash, аргументи командного рядка

Поширюйте всі аргументи в скрипті bash shell - bash, аргументи командного рядка

Я пишу дуже простий сценарій, який викликає інший сценарій, і мені потрібно розподілити параметри з мого поточного сценарію до сценарію, який я виконую.

Наприклад, моє ім'я сценарію - 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"