bash - wwe - wrestler nella vita reale




costruire liste di argomenti contenenti spazi bianchi (4)

È possibile utilizzare gli array come suggerito, con un piccolo dettaglio modificato. La linea che chiama foo dovrebbe leggere

 foo "${args[@]}"

In bash si può sfuggire agli argomenti che contengono spazi bianchi.

foo "a string"

Questo funziona anche per argomenti a un comando o funzione:

bar() {
    foo "[email protected]"
}

bar "a string"

Fin qui tutto bene, ma cosa succede se voglio manipolare gli argomenti prima di chiamare foo ?

Questo non funziona:

bar() {
    for arg in "[email protected]"
    do
        args="$args \"prefix $arg\""
    done

    # Everything looks good ...
    echo $args

    # ... but it isn't.
    foo $args

    # foo "$args" would just be silly
}

bar a b c

Quindi, come si costruiscono liste di argomenti quando gli argomenti contengono spazi bianchi?


Anch'io ho avuto un problema con questo. Stavo scrivendo uno script bash per eseguire il backup dei file importanti sul mio computer Windows (cygwin). Ho provato anche l'approccio array e ho ancora avuto alcuni problemi. Non sono sicuro di come l'ho risolto, ma ecco le parti del mio codice che sono importanti nel caso in cui ti aiuteranno.

WORK="d:\Work Documents\*"
#   prompt and 7zip each file
for x in $SVN $WEB1 $WEB2 "$WORK" $GRAPHICS $W_SQL
do
    echo "Add $x to archive? (y/n)"
    read DO
    if [ "$DO" == "y" ]; then
        echo "compressing $x"
        7zip a $W_OUTPUT "$x"
    fi
    echo ""
done

Ci sono (almeno) due modi per farlo:

(1.) Usa una matrice ed espandila usando "${array[@]}" :

bar() {
    local i=0 args=()
    for arg in "[email protected]"
    do
        args[$i]="prefix $arg"
        ((++i))
    done

    foo "${args[@]}"
}

Quindi cosa abbiamo imparato? "${array[@]}" a ${array[*]} quale "[email protected]" a $* .

(2.) O se non si desidera utilizzare gli array è necessario utilizzare eval :

bar() {
    local args=()
    for arg in "[email protected]"
    do
        args="$args \"prefix $arg\""
    done

    eval foo $args
}







whitespace