2011-12-08 32 views
8

tôi có như sau:Sử dụng chuỗi như tên biến trong kịch bản BASH

#!/bin/sh 

n=('fred' 'bob') 

f='n' 
echo ${${f}[@]} 

và tôi cần điều đó mấu chốt sau khi thay thế để thực hiện

echo ${n[@]} 

cách nào để làm điều này? Tôi chỉ nhận được

test.sh: line 8: ${${f}}: bad substitution 

khi kết thúc.

Trả lời

16

Bạn có thể làm gián tiếp biến với các mảng như thế này :

subst="$f[@]" 
echo "${!subst}" 

Vì soulmerge ghi chú, bạn không nên sử dụng #!/bin/sh cho việc này. Tôi sử dụng #!/usr/bin/env bash làm shebang của tôi, nó sẽ hoạt động bất kể Bash ở đâu trong đường dẫn của bạn.

+0

Điều này làm việc rất đẹp! Cảm ơn! – Andy

+4

+1 Gián tiếp gián tiếp ít hơn nhiều so với một nam châm lỗi hơn là 'eval'. –

5

Bạn có thể eval dòng yêu cầu:

eval "echo \${${f}[@]}" 

BTW: dòng đầu tiên của bạn nên được #!/bin/bash, bạn đang sử dụng thứ bash cụ thể như mảng

+0

+1 nếu tôi có bất kỳ phiếu bầu nào còn lại hôm nay. Bạn có thể giải thích những gì eval không? – jman

+0

eval chỉ đánh giá chuỗi tham số dưới dạng lệnh. – Andy

+1

Tôi không hiểu tại sao mọi người tiếp tục downvoting mà không cung cấp bất kỳ phản hồi nào? – soulmerge

Các vấn đề liên quan