2016-12-09 3 views
1

Ich versuche, eine Funktion wie diese installieren zu machen:Passing Abstand Zeichenfolge als Argument funktionieren

function call_fedora(){ 
     yum -y install $1; 
} 

function network_tools(){ 
     tools='net-tools traceroute nmap' 
     call_fedora $tools; 
} 

Aber wenn ich network_tools Funktion aufrufen, nur net-tools wird als Argument an call_fedora geben. Ich möchte das Gespräch sein:

yum -y install net-tools traceroute nmap 
+1

Surround '$ 1' mit doppelten Anführungszeichen ('" ') in Ihrer ersten Funktion. Auch" $ tools "mit doppelten Anführungszeichen in Ihrer zweiten Funktion. –

+1

Ich bin mir auch nicht sicher, warum Sie Zeilen mit Semikolons beenden (';')? –

+0

@JonnyHenly Das ist ein guter Rat für richtig entworfene Funktionen, aber das ist hier nicht der Fall.Quoten '$ tools' und' $ 1' werden einfach zu anderen unerwünschten Verhalten führen. – chepner

Antwort

3

Bash gibt tatsächlich call_fedora die gesamte Zeichenfolge net-tools traceroute nmap als ein Argument. Ein robuster Weg, ich weiß von der zu tun, was Sie in der Bash wollen, ist die Array-Erweiterung zu verwenden:

function call_fedora(){ 
     yum -y install "[email protected]"  # "[email protected]" means "$1" "$2" ... 
} 

function network_tools(){ 
     tools=(net-tools traceroute nmap "some funky package with spaces") 
     call_fedora "${tools[@]}"  
       # keep relationship between array elements and args of call_fedora 
} 

Die "[email protected]" bedeutet, dass jeder Parameter call_fedora wird als separater Parameter yum übergeben werden. Die doppelten Anführungszeichen bedeuten, dass die Parameter Leerzeichen enthalten können (es ist eine gute Angewohnheit).

Dann müssen Sie sicherstellen, dass Ihre tools als separate Argumente an call_fedora übergeben werden. Sie zu einem Array zu machen, macht es einfach, sie getrennt zu halten. Die "${tools[@]}" gibt Ihnen jedes Array-Element als separaten Parameter, richtig zitiert (original source).

Bearbeiten Wie @chepner in seiner comment below zeigt, gibt es einfachere, tragbare Techniken für diesen Anwendungsfall.

+1

Da 'network_tools' keine eigenen Argumente annimmt, könntest du auch' set - net-tools traceroute nmap 'verwenden, ein funky Paket mit Leerzeichen' ', gefolgt von 'call_fedora" $ @ "'. Dies würde (zusätzlich zum Löschen des unnötigen Schlüsselwortes 'function') für eine POSIX-kompatible Lösung sorgen. – chepner

Verwandte Themen