ใน bash ฉันจะสะท้อนชื่อตัวแปรได้อย่างไรไม่ใช่ค่าตัวแปร? [ปิด]


18

สมมติว่าฉันมีตัวแปรvarในทุบตี ฉันสามารถกำหนดค่าให้กับมัน ตัวอย่างเช่นฉันจะทำให้มันสตริง:

var="Test"

ฉันต้องการechoชื่อของไม่คุ้มค่าที่จัดขึ้นโดยvar var(ฉันสามารถทำสิ่งหลังได้echo $varแต่จริง ๆ แล้วฉันต้องการที่จะทำในอดีต)

คำตอบสำหรับคำถามนี้จาก SOบอกว่าจะใช้echo ${!var}แต่เมื่อฉันทำที่ฉันสะท้อนเพียงแค่ส่งกลับบรรทัดว่าง ตัวอย่างเช่นสคริปต์ทุบตีนี้

#!/bin/bash

echo "Hi"
var="Test"
echo ${!var}
echo "Bye"

ส่งคืนผลลัพธ์นี้:

Hi

Bye

มีเพียงบรรทัดว่างระหว่างสวัสดีและลาก่อนแทนที่จะvar ผมทำอะไรผิดหรือเปล่า?

ฉันทำงานทุบตี 4.1.5 (1)บนUbuntu 10.04.4


11
เอ่อ ... echo varใช่มั้ย
Braiam

5
ฉันไม่เข้าใจประเด็นนี้จริงๆ @Braiam ชี้ให้เห็นเนื่องจากคุณกำหนดชื่อของตัวแปรตั้งแต่แรกคุณจะรู้ได้ตลอดเวลาและสามารถพิมพ์ได้เสมอ คุณพยายามทำอะไร
terdon

3
ฉันคิดว่าคุณพลาดการแก้ไข SO ดังนั้น ลองvar=Test; Test=SO; echo ${!var}
iruvar

ฉันก็ไม่เข้าใจเหมือนกัน แต่คุณพยายามทำอะไร echo '$ var'
Renan Vicente

ฉันอยากรู้อยากเห็นจริงๆโปรดบอกเราว่าคุณต้องการอะไรสำหรับ!
bubakazouba

คำตอบ:


22

การขยายพารามิเตอร์เชลล์ $ {! name @}หรือ$ {! name *}สามารถทำการหลอกลวงได้

$ foo=bar
$ var_name=(${!foo@})
$ echo $var_name" = "$foo
foo = bar

แม้ว่าเป็นไปได้ฉันไม่สามารถจินตนาการถึงประโยชน์ของสิ่งนี้ ...


2
โปรดทราบว่าถ้าfooไม่ได้กำหนด แต่เป็นคุณจะได้รับfoobar foobarทางเลือกอื่น ๆ : var_name=${-+foo}(หรือ${foo+foo}) var_name=$'foo', var_name=$"foo":-)
Stéphane Chazelas

1
ถ้ามีสองตัวแปรที่มองเห็นและ foo foobar ทั้งกำหนดแสดงออกจะประเมิน${!foo@} foo foobarในฐานะที่เป็นคำตอบข้อสังเกตยูทิลิตี้มันยากที่จะจินตนาการ
CppNoob

30

หากคุณต้องการส่งออกชื่อตัวแปรแบบคงที่คุณสามารถหลีกเลี่ยง$-sign:

echo \$var

3
นี่ควรเป็นทางออกที่ยอมรับได้
David Poxon

9
ไม่ได้อยู่ที่ !! คำตอบนี้ไม่ใช่ทางออกที่ดี นี่จะออกมาง่าย$varๆ แต่มันไร้ประโยชน์ถ้าชื่อตัวแปรเป็นแบบไดนามิก ตัวอย่างเช่นสมมติว่าคุณต้องกรองชุดของตัวแปรสภาพแวดล้อมที่เริ่มต้นด้วย a PREFIX_แต่คุณไม่รู้เกี่ยวกับขนาดของชุดหรือชื่อตัวแปรในชุด โซลูชันที่ยอมรับเหมาะสมกว่าสำหรับสถานการณ์นี้
Héctor Valverde Pareja

aka var_name = "$ (echo \ $ var)"
Yordan Georgiev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.