การแทนที่ตัวแปรเฉพาะด้วย envsubst


53

ฉันพยายามเปลี่ยนตัวแปรสภาพแวดล้อมผ่านenvsubstแต่ฉันต้องการแทนที่ตัวแปรเฉพาะเท่านั้น

จากเอกสารฉันควรบอกenvsubstให้เปลี่ยนเฉพาะตัวแปรบางตัวเท่านั้น แต่ฉันไม่สามารถทำเช่นนั้นได้

ตัวอย่างเช่นถ้าฉันมีไฟล์ที่มี:

VAR_1=${VAR_1}
VAR_2=${VAR_2}

ฉันจะดำเนินการอย่างไรenvsubstเพื่อที่จะแทนที่การอ้างอิงถึง${VAR_1}เท่านั้น

คำตอบ:


4

ก่อนการโทรenvsubstคุณควรใช้การส่งออกโดยใช้เครื่องหมายอัญประกาศเดี่ยวเพื่อกลับไปVAR_1แก้ไข ในขณะที่:

export VAR_1='somevalue'

สำหรับรายละเอียดเพิ่มเติมโปรดดู:

วิธีการแทนที่ตัวแปรเชลล์ในไฟล์ข้อความที่ซับซ้อน


16
คำตอบที่ถูกต้องอยู่ด้านล่าง
Craig

130

ตามหน้า man:

envsubst [OPTION] [SHELL-FORMAT]

หากกำหนด SHELL-FORMAT เฉพาะตัวแปรสภาวะแวดล้อมที่อ้างอิงใน SHELL-FORMAT เท่านั้นที่จะถูกแทนที่ มิฉะนั้นการอ้างอิงตัวแปรสภาพแวดล้อมทั้งหมดที่เกิดขึ้นในอินพุตมาตรฐานจะถูกแทนที่

ที่สตริง SHELL-FORMAT คือ"สตริงที่มีการอ้างอิงถึงตัวแปรเชลล์ในรูปแบบ$variableหรือ${variable}[... ] ชื่อตัวแปรจะต้องประกอบด้วยอักขระ ASCII ที่เป็นตัวอักษรและตัวเลขหรือขีดเส้นใต้เท่านั้นไม่เริ่มต้นด้วยหลักและไม่เว้นว่างมิฉะนั้นการอ้างอิงตัวแปรคือ ละเว้น." .
ดังนั้นหนึ่งจะต้องผ่านชื่อตัวแปรตามลำดับไปenvsubstในสตริงรูปแบบเปลือก (เห็นได้ชัดว่าพวกเขาจะต้องหลบหนี / ยกมาเพื่อที่จะผ่านตัวอักษรไปenvsubst) ตัวอย่าง:

ไฟล์อินพุตเช่นinfile:

VAR1=${VAR1}
VAR2=${VAR2}
VAR3=${VAR3}

และคุณค่าบางอย่างเช่น

export  VAR1="one" VAR2="two" VAR3="three"

จากนั้นทำงาน

envsubst '${VAR1} ${VAR3}' <infile

หรือ

envsubst '${VAR1},${VAR3}' <infile

หรือ

envsubst '${VAR1}
${VAR3}' <infile

เอาท์พุท

VAR1=one
VAR2=${VAR2}
VAR3=three

หรือถ้าคุณชอบแบ็กสแลช:

envsubst \$VAR1,\$VAR2 <infile

ผลิต

VAR1=one
VAR2=two
VAR3=${VAR3}

13
ทำไมนี่ไม่ใช่คำตอบที่ยอมรับ?
Qsiris

3
ใช่นี่คือคำตอบที่ถูกต้อง!
โทมัส Decaux

3
หากคุณรู้จักคำนำหน้าตัวแปรที่จะใช้เพื่อ จำกัด ตัวแปรที่สามารถทดแทนได้:envsubst "$(printf '${%s} ' ${!PREFIX*})" < infile
Sam Liddicott

หรือถ้าคุณมีรายการของพวกเขาในSUBST_VARSนั้น:envsubst "$(printf '${%s} ' $SUBST_VARS)" < infile
Sam Liddicott
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.