2016-03-24 15 views
0

Ich habe ein Bash-Skript, das versucht, eine durch Tabulatoren getrennte Datei zu konvertieren und in eine kommagetrennte Datei zu konvertieren. Das folgende Skript friert, wenn ich in ‚/tmp/filename.txt‘ passieren:Sed übergibt Dateinamen von Bash, aber friert ein

#!/bin/bash 
sed 's/  /,/g' $1 > /tmp/csvFile.csv 

jedoch verhält sich das Skript richtig, wenn ich die Dateinamen explizit erklären:

#!/bin/bash 
sed 's/  /,/g' /tmp/filename.txt > /tmp/csvFile.csv 

Ich brauche dieses Skript zu sein Der Dateiname kann als Befehlszeilenargument verwendet werden, sodass er wiederverwendbar ist. Kann mir jemand sagen, was ich falsch mache?

EDIT:

My $ 1 betrug leer, mein obiges Problem verursacht. Ich verstehe immer noch nicht, warum $ 1 leer war. Hier ist die vollständige Skript:

#!/bin/bash 

function main { 
    splitCSV 
    cat /tmp/output.txt 
} 

function splitCSV { 
    sed 's/  /,/g' $1 > /tmp/csvFile.csv 
    awk -F ',' 'NR > 1 !($2 in facilities) { facilities[$2] } END { for (x in facilities) print x }' /tmp/csvFile.csv > /tmp/output.txt 
} 

main 

Ich nehme an, das eine Art von Umfang Problem ist?

+2

Sind Sie sicher, '$ 1' ist nicht leer? – anubhava

+0

Sie hatten Recht. $ 1 war leer. Aber ich verstehe nicht, warum es leer war. Ich habe meinen ursprünglichen Beitrag zu diesem Problem bearbeitet. – OnlyDean

+1

Wie rufen Sie das Skript an? Und Funktionen haben ihre eigenen Argumente. Führen Sie diesen Code über http://www.shellcheck.net/ aus, um Vorschläge zur Behebung des Problems zu erhalten. –

Antwort

3

Mein $ 1 war leer, verursacht mein oben genanntes Problem. Ich verstehe immer noch nicht, warum $ 1 leer war.

Innerhalb einer Shell-Funktion, die Positionsparameter ($1, etc.) Beziehen sich auf die Funktionsargumente, nicht das Befehlszeilenargument des Skripts. In einer Shell-Funktion manipulieren die Shell-Einbauten, die die Positionsparameter manipulieren (z. B. shift), die lokale Parameterliste der Funktion, nicht die Liste des gesamten Skripts.

Wenn Sie möchten, dass eine Shell-Funktion die Positionsparameter des gesamten Skripts anzeigt, müssen Sie sie weiterleiten. Zum Beispiel

#!/bin/bash 

function main { 
    # forward the first two function arguments 
    splitCSV "$1" "$2" 
    cat /tmp/output.txt 
} 

function splitCSV { 
    sed 's/  /,/g' "$1" > /tmp/csvFile.csv 
    awk -F ',' 'NR > 1 !($2 in facilities) { facilities[$2] } END { for (x in facilities) print x }' /tmp/csvFile.csv > /tmp/output.txt 
} 

# forward all the positional parameters, each one as one argument 
main "[email protected]" 

Sie brauchen ein bisschen vorsichtig mit zitiert, aber sein, falls die Parameter Leerzeichen oder andere Shell-Metazeichen enthalten.

+0

Das hat es getan. Vielen Dank! – OnlyDean