คำถามติดแท็ก variable-substitution

1
การทดแทนตัวแปรที่มีเครื่องหมายอัศเจรีย์ใน bash
ฉันมีบรรทัดต่อไปนี้ในไฟล์สคริปต์ bash .cfg ของฉัน DDF_SOURCE="siebel_DATA_DATE_FORMAT" DATA_DATE_FORMAT=${!DDF_SOURCE} วิธีการคือ${!DDF_SOURCE} ประเมิน? มันคง!siebel_DATA_DATE_FORMATไม่สมเหตุสมผลสำหรับฉัน


4
เหตุใดตัวแปรภายในของฉันจึงอยู่ใน 'ขณะที่อ่าน' แต่ไม่ใช่ในวงอื่นที่คล้ายกัน
เหตุใดฉันจึงได้รับค่าต่าง ๆ$xจากตัวอย่างด้านล่าง #!/bin/bash x=1 echo fred > junk ; while read var ; do x=55 ; done < junk echo x=$x # x=55 .. I'd expect this result x=1 cat junk | while read var ; do x=55 ; done echo x=$x # x=1 .. but why? x=1 echo fred …

2
$ {PATH: +: $ {PATH}} หมายถึงอะไร
ฉันเพิ่งสังเกตเห็นสิ่งต่อไปนี้ในโปรไฟล์ cygwin ของฉันแม่นยำยิ่งขึ้น: /usr/local/bin:/usr/bin${PATH:+:${PATH}} มันหมายความว่าอะไร? ทำไมไม่ใช่แค่ $ PATH นี่คือ 'ถ้า $ PATH มีอยู่แล้วเพิ่ม: $ PATH' หรือไม่ จุดประสงค์ของฉันคือการสลับลำดับและวางเส้นทาง cygwin ที่อยู่ด้านหลังหน้าต่างเส้นทาง ในอดีตฉันจะมี $PATH:/usr/local/bin:/usr/bin แต่สิ่งนี้ทำให้ฉันสับสน บางทีฉันควรจะทำ PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin" การผนวก: เมื่อสิ้นสุด $ PATH?

7
ทดแทนสองและสามในทุบตีและ zsh
ติดตามส่วนพื้นหลังในคำถามนี้ ในbashที่ฉันสามารถใช้เพื่อทดแทนคู่ใน${!FOO} zsh ${(P)FOO}ทั้งในโรงเรียนเก่า (แฮ็ค - y) eval \$$FOOทำงาน ดังนั้นสิ่งที่ฉลาดและสมเหตุสมผลที่สุดสำหรับฉันคือ${${FOO}}, ${${${FOO}}}…การทดแทนสอง / สาม / n เหตุใดจึงไม่ทำงานตามที่คาดไว้ ประการที่สอง: สิ่งที่\ทำในevalคำสั่ง? ฉันคิดว่ามันเป็นการหลบหนีทำให้บางอย่างeval \$$$FOOเป็นไปไม่ได้ จะทำการทดแทนแบบสาม / n ด้วยสิ่งนั้นได้อย่างไรในทุกเชลล์?

4
ยกเว้นตัวแปรสำหรับใช้เป็นเนื้อหาของสคริปต์อื่น
คำถามนี้ไม่เกี่ยวกับวิธีเขียนสตริงตัวอักษรที่ใช้ Escape อย่างเหมาะสม ฉันไม่พบคำถามที่เกี่ยวข้องซึ่งไม่เกี่ยวกับวิธีการหลีกเลี่ยงตัวแปรเพื่อการบริโภคโดยตรงภายในสคริปต์หรือโดยโปรแกรมอื่น ๆ เป้าหมายของฉันคือการเปิดใช้งานสคริปต์เพื่อสร้างสคริปต์อื่น ๆ เนื่องจากงานในสคริปต์ที่สร้างขึ้นจะทำงานที่ใดก็ได้ตั้งแต่ 0 ถึงnครั้งในเครื่องอื่นและข้อมูลที่สร้างขึ้นอาจเปลี่ยนแปลงก่อนที่จะทำงาน (อีกครั้ง) ดังนั้นการดำเนินการโดยตรงผ่านเครือข่ายจะ ไม่ทำงาน. รับทราบตัวแปรที่อาจมีตัวอักษรพิเศษเช่นคำพูดเดียวฉันต้องเขียนออกมาเป็นตัวอักษรสตริงหนีเต็มอย่างเช่นตัวแปรfooที่มีbar'bazควรจะปรากฏในสคริปต์ที่สร้างขึ้นเป็น: qux='bar'\''baz' ซึ่งจะเขียนโดยการต่อท้าย"qux=$foo_esc"บรรทัดอื่นของสคริปต์ ฉันใช้ Perl แบบนี้: foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'" แต่ดูเหมือนว่าเกินความจริง ฉันไม่ประสบความสำเร็จในการทำมันด้วยการทุบตีคนเดียว ฉันได้ลองหลายแบบแล้ว: foo_esc="'${file//\'/\'\\\'\'}'" foo_esc="'${file//\'/'\\''}'" แต่เครื่องหมายสแลชพิเศษอาจปรากฏในเอาต์พุต (เมื่อฉันทำecho "$foo") หรือพวกเขาทำให้เกิดข้อผิดพลาดทางไวยากรณ์ (ต้องการอินพุตเพิ่มเติมหากทำจากเชลล์)

2
วิธีการหลีกเลี่ยงพื้นที่หลังจากตัวแปร bash ในสตริง?
ฉันมีตัวแปรสำหรับสี ฉันใช้มันเพื่อตั้งค่าสีเป็นสตริงโดยการประเมินมันภายในสตริง อย่างไรก็ตามฉันต้องรวมช่องว่างหลังชื่อ (เพื่อให้ชื่อไม่มีส่วนของข้อความ) บางครั้งมันก็ดูไม่ดี ฉันจะหลีกเลี่ยงการใช้ (การพิมพ์) พื้นที่นี้ได้อย่างไร ตัวอย่าง (สมมติว่าอย่างนั้นRed=1และNC=2): echo -e "$Red Note: blabla$NC". เอาท์พุท: 1 Note: blabla2. ผลลัพธ์ที่คาดหวัง: 1Note: blabla2.

3
bash รองรับการอ้างอิงกลับในการขยายพารามิเตอร์หรือไม่
ฉันมีชื่อตัวแปรdescrซึ่งสามารถมีสตริงBlah: -> r1-ae0-2 / [123], -> s7-Gi0-0-1:1-US / Fooฯลฯ ฉันต้องการที่จะได้รับ-> r1-ae0-2, -> s7-Gi0-0-1:1-USส่วนหนึ่งมาจากสตริง ในขณะนี้ฉันใช้descr=$(grep -oP '\->\s*\S+' <<< "$descr"สำหรับสิ่งนี้ มีวิธีที่ดีกว่าในการทำเช่นนี้? เป็นไปได้ไหมที่จะทำเช่นนี้กับการขยายพารามิเตอร์

1
เหตุใดการขยายตัวแปรโดยไม่มี $ ทำงานในนิพจน์
#!/bin/bash VALUE=10 if [[ VALUE -eq 10 ]] then echo "Yes" fi ด้วยความประหลาดใจของฉันผลลัพธ์นี้ "ใช่" [[ $VALUE -eq 10 ]]ผมจะได้คิดว่ามันจะต้องมี ฉันสแกนCONDITIONAL EXPRESSIONSส่วนของman bashแล้ว แต่ไม่พบสิ่งใดที่จะอธิบายพฤติกรรมนี้

4
เป็นไปได้ไหมที่จะพิมพ์เนื้อหาของเนื้อหาของตัวแปรด้วย shell script? (การอ้างอิงทางอ้อม)
สมมุติว่าฉันประกาศตัวแปรต่อไปนี้แล้ว: $ var='$test' $ test="my string" หากฉันพิมพ์เนื้อหาของพวกเขาฉันเห็นดังต่อไปนี้: $ echo $var $test $ echo $test my string ฉันต้องการหาวิธีพิมพ์เนื้อหาของเนื้อหาของ$var(ซึ่งเป็นเนื้อหาของ$test) ดังนั้นฉันจึงพยายามทำสิ่งต่อไปนี้: $ echo $(echo $var) $test แต่นี่คือผลลัพธ์$testและไม่ใช่"my string"... เป็นไปได้หรือไม่ที่จะพิมพ์เนื้อหาของตัวแปรโดยใช้ bash?

4
$ {! FOO} และ zsh
${!FOO}ทำการทดแทนสองครั้งในbashความหมายมันใช้ค่า (สตริง) ของ FOO และใช้มันเป็นชื่อตัวแปร zshไม่รองรับคุณสมบัตินี้ มีวิธีที่จะทำให้งานนี้ในเดียวกันbashและzsh? พื้นหลัง: ฉันมีรายการตัวแปรสภาพแวดล้อมเช่น PATH MAIL EDITOR และต้องการพิมพ์ชื่อตัวแปรก่อนหลังจากนั้นค่าของมัน ใช้งานbashได้ แต่ไม่ใช่zsh: for VAR in LIST do echo $VAR echo ${!VAR} done ควรเป็นไปได้ด้วย "วิธีเก่า" ด้วยevalแต่ฉันไม่สามารถทำงาน: for VAR in LIST do echo $VAR echo `eval \$$VAR` done ฉันไม่เคยจะเข้าใจว่าทำไมฉันถึงไม่สามารถทำการทดแทนอย่างลึกซึ้งโดยพลการอย่างเช่น${${VAR}}หรือแม้ว่า${${${VAR}}}จำเป็นต้องมีดังนั้นคำอธิบายสำหรับสิ่งนั้นก็จะดีเช่นกัน

3
ไวยากรณ์ที่ถูกต้อง“ $ {PS1-}” และแตกต่างจากธรรมดา“ $ PS1” อย่างไร
ฉันกำลังดูสคริปต์ที่มี: if [ "${PS1-}" ]; then การติดตามนั้นทำให้-ฉันรำคาญเล็กน้อยเพราะดูเหมือนว่าจะไม่ได้ Posix หรือ Bash ไวยากรณ์มาตรฐาน นี่คือไวยากรณ์ที่ซ่อนเร้นอยู่ตลอดกาลหรือเป็นตัวพิมพ์ผิด การอ้างอิงใด ๆ ถึงมาตรฐาน / เอกสารจะได้รับการชื่นชม ปกติฉันจะรหัสมัน if [ "$PS1" ]; then ข้อใดถูกกว่าหรือมีข้อแตกต่างระหว่างกัน

1
ดูการขยายตัวของตัวแปร Bash สำหรับการดีบั๊กหรือไม่
มีเครื่องมือ / เทคนิคสำหรับการขยายตัวแปรเพื่อให้สามารถอ่านรหัสทุบตีได้ง่ายขึ้นหรือไม่? ตัวอย่างเช่นมันจะแปลงต่อไปนี้: DIR=/var/tmp FILE=${DIR}/file SCRIPT_ROOT=/opt/root TOOL=${SCRIPT_ROOT}/tool.sh ${TOOL} ${FILE} ถึง: DIR=/var/tmp FILE=/var/tmp/file SCRIPT_ROOT=/opt/root TOOL=/opt/root/tool.sh /opt/root/tool.sh /var/tmp/file ฉันกำลังแปลงรหัส BASH เป็น Python และการอ่านไวยากรณ์ BASH นั้นน่าเบื่อ

3
การแยกการอ้างอิงชื่อตัวแปร
ฉันสามารถทำสิ่งนี้ได้ แต่มันต้องมีการสร้างสตริงของตัวแปรแล้วทำการพิจารณาอีกครั้ง มีวิธีการย่อให้สั้นลงในคำสั่งที่ง่ายขึ้น #!/bin/bash FRUITS="BANANA APPLE ORANGE" BANANA_COLOUR="Yellow" APPLE_COLOUR="Green or Red" ORANGE_COLOUR="Blue" for fruit in $( echo $FRUITS ); do fruit_colour="${fruit}_COLOUR" echo $fruit is ${!fruit_colour} done ฉันได้ลองหลายสิ่งหลายอย่างเช่น${!"${fruit}_COLOUR"}หรือ\$${fruit}_COLOURตัวแปรอื่น ๆ อีกมากมาย แต่วิธีเดียวที่ทำงานได้คือการใช้สตริง

2
การแทนที่ตัวแปร Bash ของตัวแปรตามด้วยขีดล่าง
ตัวแปรBUILDNUMBERถูกตั้งค่าเป็น 230 ฉันคาดว่า230_จะพิมพ์สำหรับคำสั่งecho $BUILDNUMBER_แต่เอาต์พุตว่างเปล่าดังแสดงด้านล่าง # echo $BUILDNUMBER_ # echo $BUILDNUMBER 230

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