2010-05-03 14 views
39

Kabuk betiklerinde [email protected] ve $* arasındaki fark nedir?

Script argümanlarını almanın tercih edilen yolu hangisidir?

Bu konu hakkında farklı kabuk yorumlayıcıları arasında farklılıklar var mı?

+0

olası yinelenen [Ne "$ @" ve bash "$ *"? Arasındaki fark] (http://stackoverflow.com/questions/3008695 görür/what-the-and-in-bash) – Daenyth

cevap

42

here Gönderen: argümanlar onları boşluk varsa düzgün kırılır alıntı yaparken

$ @ dışında $ * gibi davranır.

(bağlantılı cevap alınmıştır) örneğin bu senaryoyu ele alalım:

for var in "[email protected]" 
do 
    echo "$var" 
done 

bu verir:

$ sh test.sh 1 2 '3 4' 
1 
2 
3 4 

Şimdi değiştirmek "[email protected]"$* için:

for var in $* 
do 
    echo "$var" 
done 

Ve şunu elde edersin:

$ sh test.sh 1 2 '3 4' 
1 
2 
3 
4 
her parametre alıntı dize @ $ ile

+11

'" $ * "' başka bir ilginç özelliği vardır. Her argüman bir boşluk yerine '$ IFS 'değeriyle ayrılır. –

+0

Değişikliklerin nasıl genişlediğini (daha sonra komutların neye benzediğini) ve bunun neden farklı sonuçlara yol açtığını açıklamak faydalı olabilir. –

1

(Google kullanarak bulundu Yanıt). Aksi takdirde aynı davranır.

Bkz: http://tldp.org/LDP/abs/html/internalvariables.html#APPREF

+0

"Alınan bir dize mi"?Bu, "$ @" 'nin kullanılmasının önce bir alıntılanmış dize oluşturduğunu ve daha sonra kabuğun bir sonraki komutu nasıl çalıştıracağına karar verdiğinde ayrıştırdığını ima eder. $ * 'Tarafından dizge bitiştirmenin atlatıldığını söylemek daha doğru olur, çünkü $ *' kullanılmayan dizge-bölme yapılır. Böylece, "$ @" 'kullanımı genellikle yalnızca daha doğru değil, aynı zamanda kabukların yorumlanması için daha az çalışmadır. –

+0

... bu arada irc: //irc.freenode.org/#bash içinde "abs" ifadesini yazmak için - Önemsiz "Advanced" Bash Scripting Guide (Önemsiz "Advanced" Bash Scripting Guide) önbelleğini filtrelemeyi bilmediğiniz sürece kullanılmamalıdır. Senaryoları değil, hataları yazmayı öğretecek. Bu ışıkta, BashGuide yazıldı: http://mywiki.wooledge.org/BashGuide –

7

benim POV bir anahtar fark "$ @" argümanları asıl sayısını korur olmasıdır. Bu, yalnızca biçimindedir. Bu nedenle, script ile etraftaki geçişleri geçmek için çok kullanışlı olan .

#!/bin/bash 

main() 
{ 
    echo 'MAIN sees ' $# ' args' 
} 

main $* 
main [email protected] 

main "$*" 
main "[email protected]" 

### end ### 

ve böyle çalıştırmak:

Örneğin, dosya my_script içeriyorsa

ANA 5 args

görür: Bu çıktıyı alacak
my_script 'a b c' d e 

MAIN, 5 adet hata görüyor

ANA 1 args

ANA görür 3 args

İlgili konular