2016-08-03 15 views
1

Ich bin gespannt, ob Sie Zeilen aus einer Funktion in bash ziehen können. Sagen, ich habe diese Funktion:Bash ziehen Elemente aus einer Funktion

error_fn() 
{ 
    echo "You need at least 2 command line arguments!" 
    echo "Program existing because you said you had a typo, please try agian" 
    echo "Sorry, one or both of the files that you entered was a directory, please try agian" 
    echo "Sorry, one or both files were not located, please try again" 
} 

Gibt es eine Möglichkeit, die erste Echo-Anweisung zu ziehen (echo „Sie müssen mindestens 2 Kommandozeilenargumente!“) Aus diesem Array?

Ich habe versucht mit:

error_fn $1 
error_fn ("$1") 

aber das alles scheint nur Ausgabe der Echo-Anweisungen in der Funktion. Irgendwelche Ideen?

+2

'error_fn | Kopf -n 1'? – Patrick

+0

Dies ist in der Tat die erste, aber nur die erste. Aber später in meinem Code möchte ich das zweite Element nennen und von dem, was ich weiß, begrenzt der Kopf, was Sie sehen können. Wenn ich also head -n 2 verwende, werden beide Zeilen angezeigt und nicht nur die zweite Zeile. Piping to Grep funktioniert auch, aber es ist nicht sehr konsistent. –

+0

Sie können 'sed '2! D'', 'sed' 3! D'' etc in diesem Fall verwenden .. aber Sie können wahrscheinlich ein Argument an die Funktion übergeben und verwenden [Groß-/Kleinschreibung] (http: // stackoverflow. com/documentation/bash/420/control-Strukturen/9948/switch-Anweisung mit dem Fall # t = 201608030436307623055) – Sundeep

Antwort

0

Sie könnten tun, um Ihr error_fn() ähnlich die folgende und übergeben Sie den Indexwert idx (Null-basierte, zum Beispiel 0 - 3) als Argument für error_fn() den entsprechenden Fehlerausgang zu haben.

Schauen Sie es sich an und lassen Sie mich wissen, wenn Sie Fragen haben. als auch eine Fehlermeldung durchlaufen $1 für die funciton

Wie für eine allgemeine Fehler/Nutzung Funktion, ziehe ich es im Allgemeinen so viel von der Kesselplatte wie möglich in einem heredoc sein, während die Fähigkeit haben. Beispiel:

usage() { 

    local ecode=${2:-0}  ## set exit code '0' by default 

    test -n "$1" && printf "\n %s\n" "$1" >&2 ## print error msg (if any) 

## heredoc of usage information 
cat >&2 << USG 

usage: ${0//*\//} _required_input_, etc.. 

This script ... (give description) 

Options: 

    -h | --help program help (this file) 

USG 

    exit $ecode; 
} 

Es sein verwenden würde Nutzungsinformationen standardmäßig angezeigt werden, einen Fehler bei der zusätzlich zu der Benutzung angezeigt werden, wenn ein Fehler Zeichenfolge als agrument 1 gegeben ist, und schließlich für das Programm 0 den Exit-Code zu setzen, indem Standard, aber es wird jedes numerische Argument als Exit-Code setzen, wenn es als zweites Argument übergeben wird. Beispiele

[ -z "$1" ] && usage "warning: insufficient input." # General usage use. 

[ -d "neededdir" ] || mkdir -p neededdir  # error on exit and set ecode 2 
[ -d "neededdir" } || usage "error: unable to create 'neededdir'." 2 
0

Die Funktion ist nur ein anderer Befehl, der den Ausgang erzeugt. Sie können es analysieren.

error_fn | head -n 1 

Wenn Sie jedoch die Funktion umschreiben ein Argument zu nehmen und eine Fehlermeldung auf dieses Argument im Zusammenhang angezeigt werden, wird es wahrscheinlich tun, was Sie beabsichtigen zu tun:

function error_fn { 
    err="$1" 

    case "$err" in 
    EREFP) echo "Error: refining particles failed" >&2 ;; 
    ECYCE) echo "Error: number of cycles exceeded" >&2 ;; 
    EHUPM) echo "Error: hangup misdirected, dangling receiver" >&2 ;; 
    *)  echo "Error: something's wrong (code:$err)" >&2 ;; 
    esac 
} 

if ! refine_particles; then 
    error_fn EREFP 
else if ! hang_up_projections; then 
    error_fn EHUPM 
fi