การมอบหมายแบบมีเงื่อนไขขึ้นอยู่กับตัวแปรสภาพแวดล้อม


11

ในสคริปต์ทุบตีฉันกำลังกำหนดตัวแปรโลคัลเพื่อให้ค่าขึ้นอยู่กับตัวแปรสภาพแวดล้อมโกลบอล ( $MYAPP_ENV)

if [ "$MYAPP_ENV" == "PROD" ]
then
    SERVER_LOGIN=foobar123@prod.example.com
else
    SERVER_LOGIN=foobar987@test.example.com
fi

มีวิธีที่สั้นกว่า (ยังสะอาด) ในการเขียนการบ้านข้างต้นหรือไม่? (สมมุติว่าใช้ตัวดำเนินการตามเงื่อนไข / แบบอินไลน์บางอย่างถ้า)

คำตอบ:


17

คุณสามารถใช้เคส / สวิตช์ในbashการทำสิ่งนี้:

case "$MYAPP_ENV" in
 PROD) SERVER_LOGIN="foobar123@prod.example.com" ;;
    *) SERVER_LOGIN="foobar987@test.example.com" ;;
esac

หรือวิธีนี้:

[ "$MYAPP_ENV" = PROD ] &&
   SERVER_LOGIN=foobar123@prod.example.com ||
   SERVER_LOGIN=foobar987@test.example.com

2
คำสั่ง case สามารถอ่านได้ง่ายกว่าการติดขัดมันทั้งหมดในหนึ่งบรรทัด (ซึ่งอาจจบลงด้วยความหายนะหากคำสั่งที่สองสามารถล้มเหลวในกรณีนี้มันเป็นเรื่องปกติ แต่การเข้าสู่นิสัยนั้นอาจมีราคาแพง) นี่เป็นวิธีที่ดีที่สุดเมื่อจัดการกับกรณีเช่นนี้
Chris Down

@Jonik - โปรดยอมรับหนึ่งในคำตอบหากตรงกับความต้องการของคุณเพื่อให้คนอื่นรู้ว่าปัญหาของคุณได้รับการแก้ไขแล้ว ขอบคุณ
slm

ฉันเดาว่าคำสั่ง case เป็นตัวเลือกที่ดีที่สุดแม้ว่าจะไม่ใช่สิ่งที่ฉันกำลังมองหา โอ้ดีไวยากรณ์ของ Bash นั้นน่าอึดอัดใจไม่สามารถเข้าใจได้ :)
Jonik

1
@ Jonik - นั่นเป็นสิ่งที่ฉันค้นพบเช่นกัน เชื่อฉันฉันกำลังมองหาทางเลือกฉันชอบเส้นกว้างที่ทำมากกว่าโปรแกรมยาวและถ้า / แล้ว / อื่นเป็น verbose มากสำหรับรสนิยมของฉันเช่นกัน
slm

9

ลอง:

[ condition ] && var=value_when_true || var=value_when_false

หากการมอบหมายของคุณเป็นตัวเลขคุณสามารถใช้bashการดำเนินการแบบไตรภาค

(( assign_condition ? value_when_true : value_when_false ))

1
อดีตไม่ได้เป็นแบบไตรภาค true && false || echo "if this was ternary, this wouldn't be executed"
Chris Down

@chris - จริง แต่ก็ยังเป็นคำตอบที่ใช้งานได้จริงแม้ว่าคำศัพท์จะไม่ถูกต้องก็ตาม
cas

@CraigSanders คำศัพท์มีความสำคัญ - ฉันเห็นวิธีนี้ใช้บ่อยเกินไปในสคริปต์เมื่อคำสั่งที่สองสามารถล้มเหลว
Chris Down

@ChrisDown: ทำการแก้ไขคำตอบตอนนี้ดีขึ้นไหม?
cuonglm

1
ฮ่า ๆ ๆ 2.5 ปีใช้เวลาในการแก้ไข cuonglm!
iruvar

4

คุณสามารถใช้&&และ||ผู้ประกอบการ

[ "$MYAPP_ENV" == "PROD" ] && SERVER_LOGIN=foobar123@prod.example.com || SERVER_LOGIN=foobar987@test.example.com
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.