2016-03-25 12 views
1

Basierend auf Lösungen unten kam ich damit bis zu entweder -q oder -a als Option zu akzeptieren, die beide mit dem Argumente:Shell-Skript mit Optionen und Argumente - Update

> #!/bin/bash 
> 
> input_file="${1:-/dev/stdin}" 
> 
> while getopts ":qa:" opt; do case $opt in 
> 
>  q) 
>  string="$OPTARG" 
>  echo "org = $string" 
>  grep -v '^>' "$input_file" | grep -x '.\{15,30\}' | sort | uniq -c | awk '{print $2, $1}' | perl -lane ' print ">dme" . $n++ . "_count=$F[1]\n$F[0]" if ($F[1] > 2) '  
>  ;; 
> 
>  a) 
>  string="$OPTARG" 
>  echo "org = $string" 
>  grep -v '^>' "$input_file" | grep -x '.\{15,30\}' | sort | uniq -c | awk '{print $2, $1}' | perl -lane ' print ">dme" . $n++ . "_count=$F[1]\n$F[0]" if ($F[1] > 2) ' 
>  ;; 
> 
>  \?) 
>  echo "Invalid option: -$OPTARG" >&2 
>  exit 1 
>  ;; 
>  :) 
>  echo "Option -$OPTARG requires an argument." >&2 
>  exit 1 
>  ;; esac done 

./script.sh -q "hsa" < test.txt > trial.txt

Wie geraten, ich nahm Option -m. Derzeit habe ich die gleichen Anweisungen für die Optionen q und m, nur für Testzwecke. Option a funktioniert und bringt das gewünschte Ergebnis. Die Option q gibt keinen Fehler aus, liefert aber nicht das gleiche Ergebnis.

Auch würde ich gerne das Argument von der Befehlszeile an die Perl-Anweisungen übergeben, d. H. Ich möchte dme mit dem ersetzt werden, was von der Befehlszeile bereitgestellt wird. Gibt es eine Möglichkeit, dies zu tun? Wie es jetzt ist, läuft die Perl-Linie gut.

Danke!

+0

'./help.sh sarbbottam

+0

@sarbbottam: Pipes und Filter - viele Programme in einem Unix-like OS liest von stdin und schreibt in stdout –

+0

'

Antwort

0

Try bash zu verwenden, ist, dass

#!/bin/sh 

zu

#!/bin/bash 

hinzugefügt nach dem ersten Kommentar ändern:

#!/bin/bash 

input_file="${1:-/dev/stdin}" 

#a and q do not have arguments and are interchangeable, option m accepts a three letter string 
while getopts ":qam:" opt; do 
    case $opt in 
    q) 
     echo "-q was triggered" #, Parameter: $OPTARG" >&2 
     #awk "$input_file" '{print $2, $1}' | perl -lane ' print ">one" . $n++ . "_count=$F[1]\n$F[0]" if ($F[1] > 2) ' > output1.txt 
     ;; 
    a) 
     #perl -lane ' print ">one" . $n++ . "_count=$F[1]\n$F[0]" if ($F[1] > 2) ' < "$input_file" > output1.txt 
     echo "-a was triggered" 
     ;; 
    m) 
     echo "-m was triggered, Parameter: $OPTARG" >&2 
     string="$OPTARG" 
     if [ ${#string} = 3 ]; then 
     echo "string $string has length 3! good" 
     else 
     echo "string $string should be of length 3!" 
     exit 
     fi 
     ;; 
    \?) 
     echo "Invalid option: -$OPTARG" >&2 
     exit 1 
     ;; 
    :) 
     echo "Option -$OPTARG requires an argument." >&2 
     exit 1 
     ;; 
    esac 
done 

Überprüfen Sie, dass ich nicht vergessen, von Ihrem ursprünglichen alles Code. Soweit ich weiß, Sie können das das Skript nicht rufen mit> zwischen Optionen, aber Sie können dies tun:

./script.sh -a -q -m "one" -X < test.html 
-a was triggered 
-q was triggered 
-m was triggered, Parameter: one 
string one has length 3! good 
Invalid option: -X 

Beachten Sie, dass X eine ungültige Option.

Bearbeiten nach Andy G aktualisiert seine Frage: Sie müssen getopts so ändern. Überprüfen Sie die Dokumente, wenn Sie möchten: oder :: nach q und a.

while getopts ":q:a:" opt; do 

Über die Perl Frage: Können Sie das versuchen?

perl -lane ' print > "$string" . $n++ . "_count=$F[1]\n$F[0]" if ($F[1] > 2) ' 
+0

Gibt einen Fehler zurück: Nicht erkannter Schalter: -q (-h zeigt gültige Optionen an) –

+0

Gut, das [[Problem ist weg. Ich habe meine Antwort aktualisiert. Wichtiger Hinweis: Sie können nicht tun ./help.sh aless80

+0

Thank you! Das ist so ziemlich die Struktur, nach der ich gesucht habe. –

Verwandte Themen