อะไร: $ {param: = value} หมายถึงอะไร


34

ฉันอ่านต่อไปนี้ค่ะ คู่มือผู้ใช้ของ Z-Shell :

คำพ้องความหมายสำหรับ 'ความจริง' คือ ':'; มันมักจะใช้ในรูปแบบนี้เพื่อให้ข้อโต้แย้งที่มีผลข้างเคียง แต่ไม่ควรใช้ - เช่น

: ${param:=value}

ซึ่งเป็นสำนวนสามัญในอนุพันธ์บอร์นเชลล์ทั้งหมด ในการขยายพารามิเตอร์$paramจะได้รับค่าค่าหากว่างก่อนและปล่อยให้อยู่คนเดียว เนื่องจากเป็นเหตุผลเดียวสำหรับการขยายพารามิเตอร์คุณจึงใช้:เพื่อละเว้นอาร์กิวเมนต์ ที่จริงแล้วเปลือกสร้าง blithely บรรทัดคำสั่ง - ลำไส้ใหญ่ตามด้วยสิ่งที่มีค่า$paramไม่ว่าจะได้รับมอบหมายหรือไม่ - จากนั้นดำเนินการคำสั่ง; มันแค่เกิดขึ้นที่ ':' จะไม่แจ้งให้ทราบถึงข้อโต้แย้งที่ได้รับ

แต่ฉันไม่เข้าใจ ฉันได้รับ:หมายถึงtrueแต่มีสอง colons ในการแสดงออก ในฐานะที่เป็นคำถามเล็กน้อยทำไมสำนวนนี้จึงใช้มากในอนุพันธ์เชลล์บอร์นทั้งหมด มันมีจุดประสงค์อะไร

หมายเหตุ: ฉันสนใจในสิ่งที่สำนวนนี้ทำในทั้งทุบตีและในzsh zsh

ขอบคุณ


คุณกำลังขอzshหรือbash?
enzotib

@enzotib ฉันสนใจทั้งคู่ ฉันชี้แจงว่า
Amelio Vazquez-Reina

คำตอบ:


31

ลองแยกชิ้นนี้ออกเป็นชิ้น ๆ

รหัสนี้ใช้คำสั่งที่:มีข้อโต้แย้งบางอย่าง คำสั่ง:ไม่ทำอะไรเลยและละเว้นอาร์กิวเมนต์ ดังนั้นบรรทัดคำสั่งทั้งหมดไม่ทำอะไรเลยยกเว้นว่าจะมีผลข้างเคียงใด ๆ เกิดขึ้นในอาร์กิวเมนต์

มีไวยากรณ์${parameter_name:=value}อยู่ในเชลล์สไตล์ Bourne ที่ไม่ใช่ของโบราณทั้งหมดรวมถึง ash, bash, ksh และ zsh มันตั้งค่าพารามิเตอร์เป็นค่าเริ่มต้นหากจำเป็น มันเทียบเท่ากับ

if [ -z "$parameter_name" ]; then parameter_name=value; fi
 ${parameter_name}

กล่าวอีกนัยหนึ่งหากparameter_nameไม่ได้ตั้งค่าหรือตั้งค่าเป็นค่าว่างให้ตั้งค่าเป็นค่าที่ระบุ จากนั้นเรียกใช้คำสั่งโดยใช้ค่าพารามิเตอร์ใหม่ มีตัวแปร${parameter_name=value}ซึ่งทำให้พารามิเตอร์นั้นว่างเปล่าถ้ามันว่างเปล่าใช้เฉพาะค่าที่ระบุหากพารามิเตอร์ไม่ได้ถูกตั้งค่า

คุณจะพบไวยากรณ์นี้ภายใต้หัวข้อ“ การขยายพารามิเตอร์” ในข้อมูลจำเพาะ POSIXและคู่มือการประ, bash, ksh และ zsh

มีรูปแบบต่าง ๆ เกี่ยวกับไวยากรณ์นี้โดยเฉพาะ${parameter_name:-value}ซึ่งช่วยให้คุณใช้ค่าเริ่มต้นสำหรับการขยายตัวนี้เท่านั้นโดยไม่ต้องกำหนดพารามิเตอร์

โดยสรุปแล้ว: ${parameter_name:=value}เป็นวิธีที่กระชับในการเขียน

if [ -z "$parameter_name" ]; then parameter_name=value; fi

11

: ไม่ได้หมายความว่าจริง - คุณอาจกำลังคิด while :แต่ถึงแม้จะไม่ได้หมายความว่า "จริง" แต่มันก็เกิดขึ้นกับมันเท่านั้น

การขยายพารามิเตอร์นี้ ( ${x:=y}) หมายถึง "กำหนดyเป็นxถ้าxไม่ได้ตั้งค่าหรือว่างเปล่าและขยายเป็นy "

$ echo "${foo:=bar}"
bar
$ foo=baz
$ echo "${foo:=bar}"
baz
$ foo=
$ echo "${foo:=bar}"
bar
$ echo "${foo}"
bar

ทุบตีแฮกเกอร์วิกิพีเดียมีบทความที่ดีในการขยายตัวพารามิเตอร์ที่นี่

เหตุผลที่:ใช้คือเพื่อให้ในขณะที่ส่วนอื่น ๆ ของคำสั่งได้รับการประเมินพวกเขาจะไม่ดำเนินการตาม (เป็น:คำสั่งที่เป็นโมฆะ) ดังนั้นคุณได้${x:=y}ทำหน้าที่ของมันโดยไม่มีผลกระทบต่อสิ่งอื่นตัวอย่างเช่นถ้าคุณไม่มี:จุดเริ่มต้นมันจะพยายามรันคำสั่งที่เรียกว่าy Y

นี่คือbashหน้าความช่วยเหลือของใน::

:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

3

ครั้งแรก :คือคำสั่งมันเรียกว่า "noop" หรือ "no operation" ดังที่ได้กล่าวไว้ใน manpage มันมักจะถูกใช้เพื่อประเมินข้อโต้แย้ง

อย่างที่สอง:คือรอบคัดเลือกในการขยายตัวแปร - :=เทคนิคก็คือ ซึ่งดังที่กล่าวไว้นี้จะตั้งค่าถ้าไม่มีค่า

สำนวนฉลาดถ้าคุณต้องการค่าเริ่มต้นของตัวแปรสภาพแวดล้อมจากนั้นคุณสามารถใช้ไวยากรณ์นี้ ตัวอย่างเช่นเมื่อรันโปรแกรมผ่านcron(8)สภาพแวดล้อมจะไม่ถูกตั้งค่าและไฟล์ dot ของเชลล์จะไม่ทำงาน ดังนั้นคุณอาจต้องตั้งค่าเริ่มต้นบางอย่าง

: ${JAVA_HOME:=/usr/local/jdk-1.6.0_28}

จากนั้นคุณสามารถ 'ตั้งค่าและลืมมัน' (จนกระทั่ง jvm เริ่มต้นเปลี่ยนแปลง)

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