2016-06-02 13 views
0

übergeben Ich versuche, alle Argumente nach -- bis zu einer Funktion zu übergeben.Durch eine Subsequenz von Bash-Argumente zu einer Funktion

Hier ist ein Beispielaufruf des Skripts.

$ ./myscript.sh exec -- run "Hello World" 
Arg 1 run 
Arg 2 Hello World 

Wie kann ich die myscript.sh (unten) für die gewünschte Ausgabe ändern?

#! /bin/bash 

f() { 
    echo Arg 1 "$1" 
    echo Arg 2 "$2" 
} 

ARGS= 
CHILD_ARGS= 

# Look to see if we want to pass args through to a script 
for ((ARGS_POS=1 ; ARGS_POS <= $# ; ARGS_POS++)); do 
    if [[ "--" == ${!ARGS_POS} ]]; then 
    ((ARGS_POS++)) 

    CHILD_ARGS=${@:$ARGS_POS} 
    ARGS=${@:1:$((ARGS_POS-2))} 
    break 
    fi 
done 

# Do something $ARGS 

# Run the child 
f $CHILD_ARGS 

Antwort

1

Wie ich verstehe Sie alle Positionsparameter entfernen möchten bis bis einschließlich --:

% cat myscript.bash 
#!/bin/bash 
while [ -n "$1" ] && [ "$1" != "--" ]; do : 
    shift 
done 
shift 
printf "<%s>\n" "[email protected]" 

Testing:

% ./myscript.bash exec -- run 'hello world' 
<run> 
<hello world> 
% ./myscript.bash 1 2 3 
<> 
% ./myscript.bash 'hello world' -- 'john doe' 
<john doe> 

Dies kann auch mit jedem Array durchgeführt werden, um sowohl eine etwas fummeliger:

#!/bin/bash 
arr=("[email protected]") 
i=0 
while [ "${#arr[@]}" -gt 0 ] && [ "${arr[$i]}" != "--" ]; do : 
    unset arr[$i] 
    ((i+=1)) 
done 
unset arr[$i] 
printf "<%s>\n" "${arr[@]}" 
printf -- "--------\n" 
printf "<%s>\n" "[email protected]" 

Test:

./myscript.bash john doe -- 'hello world' a b 
<hello world> 
<a> 
<b> 
-------- 
<john> 
<doe> 
<--> 
<hello world> 
<a> 
<b> 
0

Sie können das folgende Skript versuchen, die Anforderung zu erreichen,

#! /bin/bash 

    f() { 
     echo Arg 1 "$1" 
     echo Arg 2 "$2 $3" 
    } 

    ARGS= 
    CHILD_ARGS= 

    # Look to see if we want to pass args through to a script 
    for ((ARGS_POS=1 ; ARGS_POS <= $# ; ARGS_POS++)); do 
     if [[ "--" == ${!ARGS_POS} ]]; then 
     CHILD_ARGS=${@:$ARGS_POS+1} 
     ARGS=${@:1:$((ARGS_POS-2))} 
     break 
     fi 
    done 

    # Do something $ARGS 

    # Run the child 
    f $CHILD_ARGS 

In dem obigen Skript Werte sind vorbei nur eine einzige Variable "$ CHILD_ARGS" genannt. Aus diesem Grund teilt das Funktionsargument den Funktionsbereich in Funktion.

+0

Beherzt dies die zwei Leerzeichen zwischen "Hello" und "World"? –

+0

Nein, wenn Sie Leerzeichen möchten, sollten Sie einer Variablen $ 2- und $ 3-Werte zuweisen und sie dann drucken. wie var = "$ 2 $ 3"; echo "$ var" – Krishna

+0

andlrcs Antwort hat den Vorteil, dass ich das nicht tun muss und es die Leerzeichen erhalten wird. Ich wollte dir nur die gleiche Chance geben, die er hatte. Vielen Dank für Ihre Hilfe! –

Verwandte Themen