การแก้ไขตัวแปรในเชลล์


110

filepath=/tmp/nameฉันมีตัวแปรที่เรียกว่า

ในการเข้าถึงตัวแปรฉันรู้ว่าฉันสามารถทำได้: $filepath

ในเชลล์สคริปต์ของฉันฉันพยายามทำบางสิ่งเช่นนี้ (มีจุดมุ่งหมายเพื่อ backticks)

`tail -1 $filepath_newstap.sh`

บรรทัดนี้ล้มเหลว duuh! เนื่องจากไม่ได้เรียกตัวแปร $filepath_newstap.sh

ฉันจะต่อท้าย_newstap.shชื่อตัวแปรได้อย่างไร

โปรดทราบว่า backticks มีไว้สำหรับการประเมินนิพจน์

คำตอบ:


195

ใช้

"$filepath"_newstap.sh

หรือ

${filepath}_newstap.sh

หรือ

$filepath\_newstap.sh

_เป็นอักขระที่ถูกต้องในตัวระบุ Dot $filepath_newstapไม่ได้ดังนั้นเปลือกพยายามสอดแทรก

คุณสามารถใช้set -uเพื่อทำให้เชลล์ออกโดยมีข้อผิดพลาดเมื่อคุณอ้างอิงตัวแปรที่ไม่ได้กำหนด


7
นอกจากนี้ยังอาจกล่าวถึงset -uสิ่งที่ทำให้สคริปต์ยกเลิกหากคุณอ้างอิงตัวแปรที่ไม่ได้กำหนด
tripleee

1
อะไรคือความแตกต่างระหว่างการใช้${}และเครื่องหมายคำพูดคู่? ฉันควรจะชอบมากกว่ากัน?
user31389

3
@ user31389: ความแตกต่างคือเมื่อตัวแปรมีช่องว่างจากนั้นจะมีเพียงอัญประกาศคู่เท่านั้น
choroba

@choroba ชื่อตัวแปรหรือค่าตัวแปร?
Joshua Pinter

17

ใช้วงเล็บปีกการอบชื่อตัวแปร:

`tail -1 ${filepath}_newstap.sh`

1
คุณไม่ต้องการคำพูดคู่?
michaelsnowden

@michaelsnowden ไม่จำเป็น เพื่อความปลอดภัยใช่ แต่คำถามนี้ระบุเส้นทางอย่างชัดเจนโดยไม่มีช่องว่างและแนะนำเพิ่มเติมว่าปัญหากำลัง$filepath_newstap.shถูกตีความว่าเป็น${filepath_newstap}.shมากกว่าที่ตั้งใจไว้${filepath}_newstap.shซึ่งจะช่วยแก้ปัญหาได้

@michaelsnowden ที่บอกว่าไม่มีอะไรฉันยังไม่รู้ ทำไมคุณถึงคิดว่าต้องมีเครื่องหมายอัญประกาศคู่?

เนื่องจากคุณกำลังพยายามแก้ไขสตริงและคุณต้องมีเครื่องหมายคำพูดคู่
michaelsnowden

@michaelsnowden การขยายพารามิเตอร์เกิดขึ้นทั้งในเครื่องหมายคำพูดคู่หรือนอกเครื่องหมายคำพูดทั้งหมด เครื่องหมายคำพูดเดี่ยวหรือการคั่นอักขระด้วยเครื่องหมายคำพูดหรืออักขระอื่น ๆ ที่ไม่ถูกต้องในตัวระบุเป็นวิธีเดียวที่จะป้องกันการขยายพารามิเตอร์ ยกตัวอย่างเช่น"$filepath"_fooและทั้งสองจะขยายตัวออกไป${filepath}_foo /tmp/name_fooอย่างไรก็ตาม'$filepath'_foo, "$"filepath_fooและ$"filepath"_fooจะขยายตัวหลีกเลี่ยงทุกอย่างสมบูรณ์ นี่คือเหตุผลที่export PATH=$PATH:$addpathควรเพิ่ม:$addpath(ซึ่งอาจขึ้นอยู่กับการขยายพารามิเตอร์) ให้กับPATHตัวแปรสภาพแวดล้อม

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