Bu Bash betiğini çağırırken dosyalar argümanı için tırnak işaretleri neden gereklidir?


13

Bash senaryosunda oldukça yeniyim. Ben daha gelişmiş / kullanışlı bir komut dosyası için temel olarak kullanılan bir "testscript" var:

#!/bin/bash
files=$1
for a in $files
do
    echo "$a"
done

Ben herhangi bir tırnak olmadan çağrıldığında sadece bir dizinde bir dosya alır:

testscript *.txt

Ama tırnak işareti ile aradığımda doğru çalışıyor ve tüm metin dosyalarını seçer:

testscript '*.txt'

Burada neler oluyor?


Çok, çok açık olmak için, bunu düzeltmenin doğru yolu , komut dosyanızda çalıştırmak for a in "$@"; do(veya for a; do), böylece tırnak işaretlerini dışlamak değil, dış kabuğa globbing bırakmaktır.
Charles Duffy


Bu bir göz atmaya değer. guide.bash.academy
vascowhite

Yanıtlar:


29

Bir programı aradığınızda

testscript *.txt

o zaman kabuğunuz genişleme yapar ve tüm değerleri çalışır. Böylece programınızı etkili bir şekilde

testscript file1.txt file2.txt file3.txt file4.txt

Şimdi programınız sadece bakar $1ve sadece çalışır file1.txt.

Komut satırında alıntı yaparak, değişmez dizeyi *.txtbetiğe geçirirsiniz ve depolanan da budur $1. Daha forsonra döngünüz onu genişletir.

Normalde kullanırsınız "$@"değil $1böyle komut.

Bu, CMD komut dosyasından gelen insanlar için bir "gotcha", burada komut kabuğu globbing yapmıyor (bilindiği gibi) ve her zaman değişmez dizeyi geçiyor.


6
Sadece kullanarak, (yukarıdaki cevap yazar dışındaki insanlar için) netleştirmek için "$@"(karşıt olarak $@ya $1 $2 $3) her dosya alıntı neden olur "file1.txt" "file2.txt"vb file1.txtbu anlamsız, ama eğer varsa my file.txt, alıntı olduğunu kritik kabuk önlemek için iki dosya adları, adında birine çevirmek için ayrıştırma myve adlandırılmış biri file.txt. Bir gün çok mutsuz olmanız için her zaman kullanıcı girişi ve glob genişletme teklif edin.
Seth Robertson

2
Ve bu sadece teorik bir şey değil - Mac OS X bir keresinde argümanları düzgün bir şekilde alıntılamayan ve bazı durumlarda insanların sabit disklerini silen bir güncelleme komut dosyası ile birlikte geldi.
kabarık

2
@fluffy, bununla ilgili bir bağın var mı?
Joker

@Wildcard Ne yazık ki bu konuda herhangi bir makale bulamıyorum, ancak teknoloji dünyasında büyük bir haberdi. Apple'ın hala UNIX distribütörü olmaya devam ettiği 2003/2004 veya sonrasında olduğunu söylemek istiyorum.
kabarık

1
@ vahşi kart Ah, buldum! xlr8yourmac.com/OSX/itunes2_erased_drives.html - aslında suçlu olan bir iTunes yükseltme komut dosyasıydı.
kabarık

7

Tırnaklar olmadan kabuk *.txt, komut dosyasını çağırmadan önce genişler , bu $1nedenle yalnızca ilk genişletilen dosya olur. Tüm txtdosyalar betiğinize bu noktada argümanlardır (çok fazla olmadığı varsayılarak).

Tırnaklarla bu dize, komut dosyasına genişletilmeden geçirilir ve forumduğunuzda genişletmeyi yapmanıza izin verir .

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.