ทำไม --text =“ $ @” ผ่านคำแรกเท่านั้น


9

เมื่อฉันเรียกใช้สคริปต์ต่อไปนี้ด้วยข้อโต้แย้งบางอย่างเช่นarg1 arg2 arg3:

#!/bin/bash
zenity --entry --text="$@"

Zenity สร้างกล่องโต้ตอบรายการด้วยข้อความนี้: "arg1" ในขณะที่ฉันคาดหวัง "arg1 arg2 arg3"

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

#!/bin/bash
text="$@"
zenity --entry --text="$text"

ความแตกต่างระหว่างสคริปต์เหล่านี้คืออะไร? ทำไมคนแรกแทนที่$@ด้วยอาร์กิวเมนต์แรกเท่านั้น?

คำตอบ:


16

$@ขยายตัวที่จะแยกคำ (ในขณะที่$*การขยายตัวไปยังคำเดียว) ตามที่อธิบายไว้ในคู่มือbash ดังนั้นเมื่อคุณเขียน

zenity --text="$@"

มันขยายไป

zenity --text="$1" "$2" "$3"

อย่างไรก็ตามการกำหนดตัวแปรเชลล์ไม่ได้รับการแบ่งคำ โปรดทราบว่าการแยกข้อมูล / คำถูกละไว้ในรายการของการขยายสำหรับการกำหนดตัวแปรในคู่มือbash ลักษณะการทำงานนี้มีความสอดคล้องกับข้อมูลจำเพาะ POSIX ดังนั้นเมื่อคุณเขียน

text="$@"

ตัวแปรที่ได้รับทั้งหมดของพารามิเตอร์ตำแหน่งเป็นคำเดียวเทียบเท่ากับถ้าคุณได้เขียนtext text="$*"อันที่จริงนี่คือเหตุผลที่อัญประกาศคู่มักจะไม่จำเป็นในการกำหนดตัวแปร ทั้งสอง

text=$@

และ

text=$*

มีความปลอดภัยอย่างสมบูรณ์แบบ

ดังนั้น,

text=$@
zenity --option="$text"

ขยายออก"$text"เป็นคำเดียวซึ่งเป็นสาเหตุที่ใช้งานได้ โปรดทราบว่า--option="$@"เป็นเพียงการโต้เถียงปกติคำสั่งzenityและไม่กำหนดตัวแปรเปลือกซึ่งเป็นเหตุผลที่แยกคำที่เกิดขึ้นที่นี่ text=$@แต่ไม่ได้อยู่ใน


1
+1 สิ่งนี้จะได้ผล: zenity --text="$*"- "$*"ขยายเป็นคำเดียว
เกล็นแจ็

+1 สำหรับสอนฉันเรื่องเดียว: man! = เอกสารประกอบ ฉันควรมีการค้นหาข้อมูลทุบตีมันยังมีส่วนคู่มือที่คุณเชื่อมโยงกับ
จัดการ

7

$@ รับการขยายแต่ละพารามิเตอร์ในคำแยกกลายเป็น

zenity --entry --text="arg1" "arg2" "arg3" # syntactically wrong for zenity

ใช้$*แทนเพื่อขยายเป็นคำเดียว

zenity --entry --text="$*"

ซึ่งจะกลายเป็น

zenity --entry --text="arg1 arg2 arg3" # syntactically correct for zenity

กรุณาหลั่งน้ำตาแสงในเหตุผลที่แตกต่าง $ ข้อความจาก OP ของผลงานที่คาดว่าจะเป็นคำถาม
Iruvar

@ChandraRavoori คุณจับฉันด้วย ตามคู่มือ“ การแยกคำไม่ดำเนินการด้วยตนเองยกเว้น "$ @" "และ" หากการขยายตัวที่มีเครื่องหมายคำพูดเกิดขึ้นภายในคำการขยายตัวของพารามิเตอร์แรกจะถูกรวมเข้ากับส่วนเริ่มต้นของคำเดิม และการขยายตัวของพารามิเตอร์สุดท้ายจะถูกรวมเข้ากับส่วนสุดท้ายของคำเดิม” ดังนั้นฉันคาดว่าtext="$@"จะขยายไปถึงtext="arg1" "arg2" "arg3"ซึ่งควรจะล้มเหลว แต่ไม่ใช่กรณีอย่างแน่นอน
จัดการ

@ChandraRavoori เหตุผลคือการแยกฟิลด์ไม่ได้เกิดขึ้นในการกำหนดตัวแปร ฉันอธิบายในรายละเอียดในของฉันคำตอบ
jw013

@ jw013: แต่ตามทุบตี Reference Manual , "$@" ไม่ได้รับการแยกคำแม้กระทั่งในการกำหนดตัวแปร
ruakh

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