Doğru boş bir dize geçiyoruz betiğe argüman. komut kelime bölme gelen $1
ve $2
genişlemesini korumadığını
#!/bin/bash
/home/myapp $1 $2
:
Bunu karıştırmasını komut dosyası. Bu $1
ve $2
Birden çok kelime içeriyorsa, tek tek bu argümanlar dönüşür ve ikisinden birinin hiçbir şey genişletmek, onlar basitçe ortadan anlamına gelir.
Bu olmalıdır: Genel olarak
#!/bin/bash
/home/myapp "$1" "$2"
, kendi komut dosyası aşağıdaki gibi, çağrılan programa Tüm bağımsız değişkenleri geçmesine yapabilirsiniz:
/home/myapp "[email protected]"
tırnak sadece sözdizimi kabuk vardır; argüman verilerinin kendisinin bir parçası değildirler. Eğer kabuk haline program ""
yazdığınızda, işletim sistemi seviyesinde, program boş bir C dili dize alır: bir işaretçi boş byte. Tırnak yok.
Sen argüman ""
(iki çift tırnak yapılmış iki karakter dizesini) geçebileceği ancak boş bir argüman değil. Bunu yapmanın bir yolu, örneğin, '""'
: tek tırnak içine sarın.
Kabuk sözdizimini bir meta düzeyinde işlerken ortaya çıkan tek neden: kabuk betiklerinin kaynak kodunun kaynak kodunun içinden geçirilmesi, örneğin tırnak işaretleri, boş veya başka şekilde. Kabuk, eval
adında bir komutla kaynak kodunu bir argüman (veya çoklu argümanlar) olarak alır ve değerlendirir. eval
önce
empty_shell_string_syntax='""' # this variable holds the characters ""
eval empty_var=$empty_shell_string_syntax # empty_var gets set to empty string
çağrılır, komut satırı genişleme tabidir. Bu genişleme sözdizimi $empty_shell_string_sytnax
kaldırır ve içindekiler, karakterler ""
değiştirir. Böylece, eval empty_var=""
dizesini alır. Bunu değerlendirir ve bu nedenle empty_var
, sözdizimi belirttiği gibi boş dizeye ayarlanır.
Mükemmel, tam olarak ihtiyacım olan şey Teşekkürler! – Josh
'arg2 = ' ''' bunu echo zaman' ince görünecektir, ama bunu kullanmaya çalışırsanız ('/ home/Uygulamam $ 1 $ arg2' olduğu gibi) başka bir şeye boş dize geçmek, bu kazandı Ayarı t çalışması - boş bir dize değil, iki çift tırnaktan oluşan dizgeyi geçirir. –
@GordonDavisson * Bu boş dizgeyi korumasını ve yerine getirmesini istiyorum: '/ home/myapp arg1 ''' * OP'nin ne istediği tam olarak bu değil mi? –