--Text = “$ @” neden sadece ilk kelimeyi iletiyor?


9

Aşağıdaki komut dosyasını aşağıdaki gibi bazı bağımsız değişkenlerle çalıştırdığımda arg1 arg2 arg3:

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

zenity şu metni içeren bir giriş iletişim kutusu oluşturur: "arg1", beklerken "arg1 arg2 arg3"

Aşağıdaki komut dosyası gibi bir değişken kullanırsanız, giriş metni için tüm bağımsız değişkenleri gösterir.

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

Bu komut dosyaları arasındaki fark nedir? İlki neden $@sadece ilk argümanla yer değiştiriyor ?

Yanıtlar:


16

$@kılavuzda$* açıklandığı gibi ayrı kelimelere ( tek bir kelimeye genişler) genişler . Böylece, yazarkenbash

zenity --text="$@"

genişler

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

Ancak, kabuk değişkeni atamaları sözcük bölünmesine maruz kalmaz. Alandaki / kelime bölünmesinin, bashkılavuzdaki değişken atamaları için genişletmeler listesinde yer almadığını unutmayın . Bu davranış POSIX spec ile tutarlıdır . Yani, yazdığın zaman

text="$@"

değişken text, tüm konum parametrelerini tek bir sözcük olarak alır, yazmış olmanıza eşit text="$*". Gerçekten de, değişken atamalarda çift tırnakların genellikle gereksiz olmasının nedeni budur. Her ikisi de

text=$@

ve

text=$*

tamamen güvenlidir.

Yani,

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

"$text"tek bir kelimeye genişler , bu yüzden bu işe yarar. Bunun --option="$@"komut için normal bir argüman olduğunu zenityve bir kabuk değişkeni ataması olmadığını unutmayın, bu yüzden kelime bölme burada gerçekleşir, ancak içinde gerçekleşmez text=$@.


1
+1. Bu da işe yarayacak: zenity --text="$*"- "$*"tek bir kelimeye genişler.
glenn jackman

Bana bir şey öğretmek için +1: man! = Belgeler. Bilgi bash'ı aramış olmalıydım, aynı zamanda bağlandığınız manuel bölümü de içeriyordu.
manatwork

7

$@ her parametreyi ayrı bir sözcükle genişleterek

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

$*Bunun yerine tek bir kelimeyle genişletmek için kullanın

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

hangisi olacak

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

Lütfen OP'nin sorusundaki $ text değişkeninin neden beklendiği gibi çalıştığına
ışık tutunuz

@ChandraRavoori, beni bununla yakaladın. “Kelime bölme işlemi yapılmaz," $ @ "ve" istisna dışında "bir sözcük içinde çift tırnaklı genişleme gerçekleşirse, ilk parametrenin genişlemesi orijinal kelimenin başlangıç ​​kısmı ile birleştirilir, ve son parametrenin genişletilmesi orijinal sözcüğün son kısmı ile birleştirilir. ”, bu yüzden text="$@"genişlemesini beklerdim text="arg1" "arg2" "arg3", ki bu başarısız olur. Ama kesinlikle böyle değil.
manatwork

@ChandraRavoori Bunun nedeni değişken atamalarda alan ayırmanın gerçekleşmemesidir. Cevabımda daha ayrıntılı olarak açıklarım .
jw013

@ jw013: Ama uygun Manuel Bash Referans , "$@" yapar , kelime bölme geçmesi bile değişken ödevlerde.
ruakh

@ruakh Bash el kitabı bildiğim kadarıyla bunu söylemiyor. Bir teklifin var mı?
jw013
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.