Neden bir fonksiyonda $ 1 betiğin ilk argümanını yazdırmıyor?


13

Neden bu basit bash betiğinde echo $1yazdırmıyor $1?

#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something

$ ./function.sh 123  -> why doesn't it print '123' as a result?

6
çünkü print_something öğesini çağırırken 1 $ 'ı unuttun. Lütfen başlığa değil soruya metin eklemeye çalışın.
Rui F Ribeiro

Teşekkürler. Komut dosyasında komutları eklemem gerekirse echo argümanı ne olmalıdır: print_something "$ 1"; print_something "$ 2"; ve belki daha fazlası?
pietro letti

13
Bunu HNQ'da gördüğümde dolar faturaları bastığınızı düşündüm ve yazıcınızın sahte para bastığınızı nasıl algıladığına dair bazı sulu hikayeleri okumayı umuyordum.
boru

@pipe Daha önce başıma gelmiştim, bir sebepten ötürü sadece anti-baskı önleme ile olanları yazdırmayı reddediyor.
Codingale

Yanıtlar:


41

Konumsal parametreler, komut dosyasının ana düzeyindeki komut dosyasının bağımsız değişkenlerini , ancak işlev gövdesindeki işlev bağımsız değişkenlerini belirtir . Yani

print_something Something

aslında yazdırır Something.

Komut dosyasının bağımsız değişkenlerini bir işleve iletmek istiyorsanız, bunu açıkça yapmalısınız. kullanım

print_something "$1"

ilk argümanı geçmek veya

print_something "$@"

hepsini aktarmak için, ancak örnekte işlev sadece ilkini kullanır.


1
Geçme "$@"için print_somethingşu anda yazıldığı gibi, hala sadece olsa argümanlar ilk yazdırmak istiyorum.
Kusalananda

13
Ama asıl mesele, tüm argümanların nasıl geçileceğini göstermekti . Fonksiyonun, durduğu gibi, argümanlarının sadece ilkini kullanması biraz önemsizdir.
weirdan

Sadece ilk argüman kullanılıyorsa, tüm argümanları aktarmanın bir anlamı olmadığını düşünmek.
Kusalananda

14
@ allo No. "$*"tek bir dize (ilk karakterine katılmış $IFS) olurken "$@", tek tek alıntılanan öğelerin bir listesi olacaktır.
Kusalananda

5
@Kusalananda, komut satırı parametrelerini kullanmak üzere bir işleve geçirmek isteyen birine , bu durumda böyle bir parametre "$@"olsa bile , tüm bu durumları kapsamaktır. OP ikinci bir parametre eklemeye karar verirse, işlev çağrısında değiştirilecek bir şey yoktur. Ve bunu okuyan herkes, daha sonra tekrar yapmak zorunda kalmamak için bunu yapmanın doğru yolunu öğrenecektir.
Monty Harder

10

Bunun nedeni, çağrılan bir işlevin, ebeveynin / arayanın kümesinden bağımsız olarak kendi konum parametreleri kümesini almasıdır. Deneyin

print_something "$1"

(ve echo "$1"hatta daha iyisi printf '%s\n' "$1", parametre genişletmeleri vermeyi unutmayın ve bunlar echorastgele veriler için kullanılamaz).


Neden bahsettiğinizi daha net hale getirmeniz gerekiyor. Arayan kişi $1genellikle işlevinkinden farklıdır $1, ancak yukarıda önerildiği gibi kullanıldığında aynı hale gelebilir. Eğer doğru yaparsam , fonksiyon tek parametrelerle çağrıldığında echoaynı ( echo $1) kalabilir ( print_something $2arayanın 1 $ ' $1
ını alır

6
Genişletilecek dosyaların $ IFS ile ayrılmış bir liste olarak ele alınmasını echo $1istemiyorsanız kullanmak mantıklı değildir $1. echo "$1"daha mantıklı olurdu, ancak gibi $1değerlerin içeriğini çıktı olmaz , ...$1-nene-EE
Stéphane Chazelas
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.