Bạn muốn sử dụng "$ @" (đô la được trích dẫn tại) để chuyển các tham số cho một chỉ số con. Như vậy ...
ls-color.sh:
#!/bin/bash
/bin/ls --color=auto "$@" # passes though all CLI-args to 'ls'
Tại sao .....
Từ trang người đàn ông Bash :
$*
- Mở rộng đến các tham số vị trí, bắt đầu từ một. Khi mở rộng xảy ra trong dấu ngoặc kép, nó sẽ mở rộng thành một từ duy nhất với giá trị của mỗi tham số được phân tách bằng ký tự đầu tiên của biến đặc biệt IFS. Nghĩa là, "$*"
tương đương với
"$1c$2c..."
, trong đó c là ký tự đầu tiên của giá trị của biến IFS. Nếu IFS không được đặt, các tham số được phân tách bằng dấu cách. Nếu IFS rỗng, các tham số được nối mà không có dấu phân tách can thiệp.
$@
- Mở rộng đến các tham số vị trí, bắt đầu từ một. Khi mở rộng xảy ra trong dấu ngoặc kép, mỗi tham số sẽ mở rộng thành một từ riêng biệt. Nghĩa là, "$@"
tương đương với "$1" "$2" ...
Nếu phần mở rộng được trích dẫn kép xảy ra trong một từ, phần mở rộng của tham số đầu tiên được nối với phần đầu của từ gốc và phần mở rộng của tham số cuối cùng được nối với phần cuối cùng của từ gốc. từ ngữ. Khi không có tham số vị trí
"$@"
và $@
mở rộng thành không (nghĩa là chúng bị loại bỏ).
Thiết lập một số tập lệnh demo ...
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
"$@"
- quote-dollar-at là một chuyển đổi danh tính để chuyển lại các args đến một vỏ con (~ 99% thời gian, đây là những gì bạn muốn làm):
./quoted-dollar-at.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa
# $2=
# $3= 'cc cc'
# $4= "ddd ddd"
"$*"
- quote-dollar-star đập các args thành một chuỗi duy nhất (~ 1% thời gian bạn thực sự muốn hành vi này, ví dụ: trong điều kiện if [[ -z "$*" ]]; then ...
:):
./quoted-dollar-star.sh aaa '' "'cc cc'" '"ddd ddd"'
# $1= aaa 'cc cc' "ddd ddd"
# $2=
# $3=
# $4=
$*
/ $@
- không có dấu ngoặc kép, cả hai dạng đều loại bỏ một cấp của dấu ngoặc kép và giải thích khoảng trắng từ các chuỗi bên dưới nhưng bỏ qua các ký tự trong dấu ngoặc kép (hầu như luôn luôn, đây là một sai lầm):
./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
Nếu bạn muốn giải trí, bạn có thể sử dụng "$ @" để lồng mọi thứ sâu tùy thích, đẩy và đưa các phần tử ra khỏi ngăn xếp args nếu bạn muốn.
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"