Ви хочете використовувати "$ @" (котирується долар у), щоб передати параметри до індексу. Як так….
ls-color.sh:
#!/bin/bash
/bin/ls --color=auto "$@" # passes though all CLI-args to 'ls'
Щодо того .....
На сторінці чоловіка Bash :
$*- Розширюється на позиційні параметри, починаючи з одиниці. Коли розширення відбувається в межах подвійних лапок, воно розширюється на одне слово зі значенням кожного параметра, розділеним першим символом спеціальної змінної IFS. Тобто, "$*"еквівалентно
"$1c$2c...", де c - перший символ значення змінної IFS. Якщо IFS не встановлено, параметри розділяються пробілами. Якщо IFS недійсний, параметри з'єднуються без втручання роздільників.
$@- Розширюється на позиційні параметри, починаючи з одиниці. Коли розширення відбувається в межах подвійних лапок, кожен параметр розширюється на окреме слово. Тобто, "$@"еквівалентно "$1" "$2" ...Якщо розширення з подвійним цитуванням відбувається в межах слова, розширення першого параметра з'єднується з початковою частиною вихідного слова, а розширення останнього параметра з'єднується з останньою частиною оригіналу слово. Коли немає позиційних параметрів,
"$@"а також $@розширити нічого (тобто, вони будуть видалені).
Налаштування деяких демо-скриптів ...
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 $@' > dollar-at.sh
echo './echo-params.sh "$*"' > quoted-dollar-star.sh
echo './echo-params.sh "$@"' > quoted-dollar-at.sh
chmod +x *.sh
"$@"- quoted-dollar-at - це трансформація ідентичності для повторної передачі аргументів до нижньої оболонки (~ 99% часу, це ви мали намір зробити):
./quoted-dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa
# $2=
# $3= 'cc cc'
# $4= "ddd ddd"
"$*"- зірка з котирувальним доларом розбиває аргументи в єдиний рядок (~ 1% часу, коли ви дійсно бажаєте такої поведінки, наприклад, в умовному випадку if [[ -z "$*" ]]; then ...:):
./quoted-dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa 'cc cc' "ddd ddd"
# $2=
# $3=
# $4=
$*/ $@- без лапок, обидві форми знімають один рівень котирування та інтерпретують пробіли з нижчих рядків, але ігнорують символи цитат (майже завжди це помилка):
./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
Якщо ви хочете повеселитися, ви можете використовувати "$ @", щоб вкласти речі так глибоко, як хочете, відштовхуючи та вискакуючи елементи зі стека аргументів, якщо хочете.
function identity() {
"$@"
}
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"