2016-03-24 13 views
0

Sekme ile ayrılmış bir dosyayı dönüştürmeye ve virgülle ayrılmış bir dosyaya dönüştürmeye çalışan bir bash komut dosyası var. Ben '/tmp/filename.txt' de geçerse aşağıdaki komut donduruyor: There is komut dosyasına gerekBaştan sona Bash dosya adlarını geçiyor ama donuyor

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

:

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

Ancak, komut dosyası açıkça dosya adı ilan etmeleri halinde düzgün davranır dosya adını bir komut satırı argümanı olarak alabilmek, böylece tekrar kullanılabilir. Bana yanlış yaptığımı söyleyen var mı?

DÜZENLEME:

Benim 1 $ benim yukarıdaki soruna neden boştu. Hala 1 dolar neden boş olduğunu anlamıyorum. İşte tam betik:

#!/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 

Bu tür bir kapsam sorunu olduğunu varsayalım?

+2

'$ 1' boş olmadığından emin misiniz? – anubhava

+0

Haklıydın. 1 $ boştu. Ama anlamıyorum ki, boştu. Bu sorunla ilgili asıl gönderiyi düzenledim. – OnlyDean

+1

Betiği nasıl çağırıyorsunuz? Ve işlevlerin kendi argümanları var. Sorununuzu giderebilecek öneriler almak için http://www.shellcheck.net/ adresinden bu kodu çalıştırın. –

cevap

3

$ 1 boştu ve yukarıdaki sorunuma neden oldu. Hala 1 dolar neden boş olduğunu anlamıyorum. Bir kabuk işlevi İçinde

, konumsal parametreler ( $1, vb.) işlevi argüman değil, komut dosyasının komut satırı argümanları bakın. Benzer şekilde, bir kabuk işlevinin içinde, konum parametrelerini (ör. shift) işleyen kabuk yerleşik dosyaları, genel komut dosyasının listesini değil, işlevin yerel parametre listesini manipüle eder.

Tüm komut dosyasının konumsal parametrelerini görmek için bir kabuk işlevini istiyorsanız, bunları iletmeniz gerekir. Örneğin,

#!/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]" 

Sen durumda parametreler boşluk veya diğer kabuk meta içerirler, ancak, alıntı ile biraz dikkatli olmak gerekiyor.

+0

Bunu yaptı. Çok teşekkür ederim! – OnlyDean

İlgili konular