Cách đánh giá biến gián tiếp


7

Tôi đang cố gắng in một giá trị đơn giản cho $ AR1_p1 nhưng biến $ i không được đánh giá.

for i in 1 2 3 4
do
AR1_p1=22
AR1_p2=23
AR1_p3=24
AR1_p3=25
echo $AR1_p$i
done 

Nó giống như kết hợp năng động. Bất kỳ đề xuất về làm thế nào để sửa lỗi này?.


1
Có lẽ dòng echo nên là: echo $ AR1_p1 $ i
parkamark

@parkamark, tôi muốn điều này năng động như p1, p2, v.v.
serverliving.com

2
Bạn nên sử dụng mảng thay thế. Những gì bạn muốn là không thể (hoặc ít nhất là phong cách rất xấu).
Sven

@Sven, tôi hiểu tôi có thể sử dụng mảng nhưng vì tôi chỉ có 4 giá trị để đánh giá. Vì vậy, đây là một vấn đề với bash?
serverliving.com

@ serverliving.com không, đây không phải là vấn đề với Bash. Bash đang hành xử chính xác theo cách nó nên, và đây thực sự là một vấn đề mà nó có ý nghĩa khi sử dụng một mảng. Tại sao nó là một vấn đề để sử dụng một mảng gồm 4 yếu tố?
Jules

Câu trả lời:


6

Vòng lặp này hoạt động. Khác sử dụng Mảng.

$ for i in 1 2 3 4; do AR1_p1=22; AR1_p2=23; AR1_p3=24; AR1_p4=25; echo $((AR1_p$i)); done 
22
23
24
25

1
Lưu ý điều này sẽ chỉ làm việc cho các tham số có giá trị nguyên.
chepner


7

Mỗi bình luận được đề xuất, mảng nên được sử dụng:

#!/bin/bash

AR1_p=(22 23 24 25)

for i in {1..4}
do
  echo "${AR1_p[$i-1]}"
done

Điều này không có ý nghĩa gì. Các forvòng lặp là một phép gán mảng đã ...
mikeserv

Bạn đúng, nó không có nghĩa gì cả. Nhiều như điều này đã có phiếu bầu, nó không giải quyết đầy đủ yêu cầu thực sự của câu hỏi ban đầu. Điều đó đã được giải quyết trong câu trả lời khác ở trên liên quan đến "bash tham chiếu gián tiếp", đó là một giải pháp tốt hơn cho những gì OP đang cố gắng đạt được. Tuy nhiên, bài đăng của tôi cho thấy một số điều phức tạp có thể được sử dụng trong BASH để đạt được điều tương tự, lưu ý rằng những điều trên có thể được giảm xuống thành "for i in {22..25}; làm echo $ i; xong" , nhưng câu trả lời đó không thực sự có liên quan đến câu hỏi ban đầu.
parkamark

3

Sử dụng eval:

#!/bin/bash

AR1_p1=22
AR1_p2=23
AR1_p3=24
AR1_p4=24
for i in 1 2 3 4
do
    eval echo \$AR1_p$i
done

echo chỉ mở rộng $ i. Khi biểu thức này đạt tới eval, nó giống như: $ AR1_p1. Eval cố gắng đánh giá và đưa ra kết quả.


6
evalthường là một ý tưởng tồi Trong ví dụ này tất nhiên bạn không xử lý đầu vào bên ngoài, nhưng nếu bạn đã bao giờ làm bạn cần phải rất chắc chắn rằng bạn khử trùng bất kỳ dữ liệu để bạn vượt qua eval. (Điều này thật khó. Rất khó. Tốt hơn là bỏ qua nó.)
Wildcard

1
@Wildcard - thực sự không khó lắm đâu. Và học cách làm đúng cách không nên bỏ qua .
mikeerv

1

POSIXly:

for i in 1 2 3 4
do  AR1_p1=22
    AR1_p2=23
    AR1_p3=24
    AR1_p4=25
    echo "$((AR1_p$i))"
done

Một chút ít lộn xộn, có thể:

for i in 1 2 3 4
do  echo "$((AR1_p$i=i+21))"
done

Vẫn POSIXly, nhưng hợp lý hơn nhiều:

i=0 n=21 l=4
while  [ "$l" -ge "$((i+=1))" ]
do     echo "$((AR1_p$i=i+n))"
done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.