2016-06-02 2 views
0

Я пытаюсь передать все аргументы после -- через функцию.Прохождение через подпоследовательность аргументов bash функции

Вот пример вызова скрипта.

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

Как можно модифицировать myscript.sh (ниже) для требуемого выхода?

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

ответ

1

Как я понимаю, вы хотите, чтобы удалить все позиционные параметры до сезам включительно --:

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

Тестирование:

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

Это также можно сделать с помощью любого массива и является еще немного затруднительно:

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

Тест:

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

Вы можете попробовать следующий сценарий для достижения требований,

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

В приведенном выше сценарии, значения проходят с использованием только одной переменной под названием «$ CHILD_ARGS». Из-за этого в функции аргумент функции будет делить пространство w.r.t.

+0

Сохраняет ли это два пробела между «Hello» и «World»? –

+0

Нет, если вам нужно место, вам нужно присвоить переменную $ 2 и $ 3, а затем распечатать ее. как var = "$ 2 $ 3"; echo «$ var» – Krishna

+0

Ответ andlrc имеет то преимущество, что мне не нужно это делать, и он сохранит пробелы. Я просто хотел дать вам ту же возможность, что и он. Спасибо за вашу помощь снова! –

Смежные вопросы