A sintaxe provavelmente mais próxima disso é:
p_out='/some/path' arg_1='5' my_script
Existe alguma maneira fácil de passar (receber) parâmetros nomeados para um script de shell?
Por exemplo,
my_script -p_out '/some/path' -arg_1 '5'
E dentro de my_script.sh
, receba-os como:
# I believe this notation does not work, but is there anything close to it?
p_out=$ARGUMENTS['p_out']
arg1=$ARGUMENTS['arg_1']
printf "The Argument p_out is %s" "$p_out"
printf "The Argument arg_1 is %s" "$arg1"
Isso é possível no Bash ou no Zsh?
Se você não se importar em se limitar a nomes de argumentos de letras únicas, ou seja, my_script -p '/some/path' -a5
, então no bash você pode usar o getopts
incorporado, por exemplo
#!/bin/bash
while getopts ":a:p:" opt; do
case $opt in
a) arg_1="$OPTARG"
;;
p) p_out="$OPTARG"
;;
\?) echo "Invalid option -$OPTARG" >&2
;;
esac
done
printf "Argument p_out is %s\n" "$p_out"
printf "Argument arg_1 is %s\n" "$arg_1"
Então você pode fazer
$ ./my_script -p '/some/path' -a5
Argument p_out is /some/path
Argument arg_1 is 5
Há um tutorial Small getopts ou você pode digitar help getopts
no prompt do shell. p>
Eu roubei isso de drupal.org , mas você poderia fazer algo assim:
while [ $# -gt 0 ]; do
case "$1" in
--p_out=*)
p_out="${1#*=}"
;;
--arg_1=*)
arg_1="${1#*=}"
;;
*)
printf "***************************\n"
printf "* Error: Invalid argument.*\n"
printf "***************************\n"
exit 1
esac
shift
done
A única ressalva é que você precisa usar a sintaxe my_script --p_out=/some/path --arg_1=5
.
Com zsh
, você usaria zparseopts
:
#! /bin/zsh -
zmodload zsh/zutil
zparseopts -A ARGUMENTS -p_out: -arg_1:
p_out=$ARGUMENTS[--p_out]
arg1=$ARGUMENTS[--arg_1]
printf 'Argument p_out is "%s"\n' "$p_out"
printf 'Argument arg_1 is "%s"\n' "$arg_1"
Mas você chamaria o script com myscript --p_out foo
.
Observe que zparseopts
não suporta a abreviação de opções longas ou a sintaxe --p_out=foo
como o GNU getopt(3)
.
Este é o meu script e funciona:
for ARGUMENT in "$@"
do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
VALUE=$(echo $ARGUMENT | cut -f2 -d=)
case "$KEY" in
STEPS) STEPS=${VALUE} ;;
REPOSITORY_NAME) REPOSITORY_NAME=${VALUE} ;;
*)
esac
done
echo "STEPS = $STEPS"
echo "REPOSITORY_NAME = $REPOSITORY_NAME"
Uso
bash my_scripts.sh STEPS="ABC" REPOSITORY_NAME="stackexchange"
Resultado do console:
STEPS = ABC
REPOSITORY_NAME = stackexchange
Os STEPS e REPOSITORY_NAME estão prontos para uso no script.
Não importa em que ordem os argumentos estão.
Espero que isso ajude.
Acabei de criar este script
while [ $# -gt 0 ]; do
if [[ $1 == *"--"* ]]; then
v="${1/--/}"
declare $v="$2"
fi
shift
done
transmita-o como my_script --p_out /some/path --arg_1 5
e, em seguida, no script, você pode usar $arg_1
e $p_out
.
Se uma função ou um aplicativo tiver mais de zero argumentos, sempre terá um último argumento.
Se você quiser ler pares de sinalizadores e valores de opção, como em:
$ ./t.sh -o output -i input -l last
E você deseja aceitar um número variável de pares de opção / valor,
E não quer uma enorme árvore "se ... então ... mais ... fi",
Depois de verificar a contagem de um argumento de não-zero e até mesmo,
Escreva um loop while com estas quatro instruções eval como corpo, seguido por uma instrução case usando os dois valores determinados em cada passagem pelo loop.
A parte complicada do script é demonstrada aqui:
#!/bin/sh
# For each pair - this chunk is hard coded for the last pair.
eval TMP="'$'$#"
eval "PICK=$TMP"
eval TMP="'$'$(($#-1))"
eval "OPT=$TMP"
# process as required - usually a case statement on $OPT
echo "$OPT \n $PICK"
# Then decrement the indices (as in third eval statement)
:<< EoF_test
$ ./t.sh -o output -i input -l last
-l
last
$ ./t.sh -o output -l last
-l
last
$ ./t.sh -l last
-l
last
EoF_test
mitsos@redhat24$ my_script "a=1;b=mitsos;c=karamitsos"
#!/bin/sh
eval "$1"
você acabou de injetar parâmetros de linha de comando dentro do escopo do script!
Tags bash zsh shell-script arguments