2013-03-14 20 views
9
#!/bin/bash 
COUNTER=$# 
until [ $COUNTER -eq 0 ]; do 
args[$COUNTER]=\$$COUNTER 
let COUNTER-=1 
done 
echo ${args[@]} 

Khi tôi chạy này, tôi nhận được kết quả như sauTạo mảng trong vòng từ số lập luận

[email protected]:~/sandbox# ./script.sh first second third 
$1 $2 $3 

và tôi hy vọng nó vang ra những gì $ 1, $ 2, và $ 3 không phải là một giá trị văn bản của "$ 1"

Tôi đang cố viết một tập lệnh bằng bash để tạo một mảng có kích thước của số đối số mà tôi đưa ra.
Tôi đang mong đợi

[email protected]:~/sandbox# ./script.sh alpha bravo charlie 
alpha bravo charlie 

hoặc

[email protected]:~/sandbox# ./script.sh 23425 jasson orange green verb noun coffee 
23425 jasson orange green verb noun coffee 

Vì vậy, mục tiêu là làm cho

args[0]=$1 
args[1]=$2 
args[2]=$3 
args[3]=$4 

Cách mà tôi có nó, các $1,$2,$3 không được suy nhưng chỉ được đọc dưới dạng chuỗi văn bản.

Trả lời

22

Bạn có thể sử dụng toán tử += để thêm vào mảng.

args=() 
for i in "[email protected]"; do 
    args+=("$i") 
done 
echo "${args[@]}" 

này cho thấy cách phụ thêm có thể được thực hiện, nhưng cách dễ nhất để có được kết quả mong muốn của bạn là:

echo "[email protected]" 

hoặc

args=("[email protected]") 
echo "${args[@]}" 

Nếu bạn muốn giữ lại phương pháp hiện tại của bạn, bạn cần sử dụng indirection với !:

args=() 
for ((i=1; i<=$#; i++)); do 
    args[i]=${!i} 
done 

echo "${args[@]}" 

Từ tài liệu tham khảo Bash: (!)

Nếu ký tự đầu tiên của tham số là một dấu chấm than, mức gián tiếp biến được giới thiệu. Bash sử dụng giá trị của biến được hình thành từ phần còn lại của tham số là tên của biến số ; biến này sau đó được mở rộng và giá trị đó được sử dụng trong phần còn lại của sự thay thế, thay vì giá trị của tham số. Điều này được gọi là mở rộng gián tiếp. Các trường hợp ngoại lệ đối với trường hợp này là các mở rộng $ {! Prefix} và $ {! Name [@]} được mô tả bên dưới. Các dấu chấm than phải ngay lập tức theo dấu ngoặc trái để giới thiệu tính không giới hạn.

+0

vâng, đúng vậy. cảm ơn vì đã trả lời nhanh chóng. Tôi vẫn còn một chút noob với kịch bản. – spezticle

+1

+1 như thường lệ. FYI, 'cho i' có thể là một tối ưu hóa đáng kể so với' for i in "$ @" 'trong hầu hết các shell (hầu như không đáng nhắc đến, nhưng tôi nghĩ rằng tôi đã từng thấy bạn viết nó như thế này trước đây.) – ormaaj