Eu estou tentando escrever um script onde eu quero verificar se algum dos parâmetros passados para um script bash corresponder a uma seqüência de caracteres. A maneira que eu tenho configurado agora é
if [ "$3" != "-disCopperBld" -a "$4" != "-disCopperBld" -a "$5" != "-disCopperBld" -a "$6" != "-disCopperBld"]
mas pode haver um grande número de parâmetros, então eu queria saber se existe uma maneira melhor de fazer isso?
Obrigado
EDIT: Eu tentei este pedaço de código fora e liguei para o script com a opção, -disableVenusBld, mas ainda imprime "Starting build". Estou fazendo algo errado? Desde já, obrigado!
while [ $# -ne 0 ]
do
arg="$1"
case "$arg" in
-disableVenusBld)
disableVenusBld=true
;;
-disableCopperBld)
disableCopperBld=true
;;
-disableTest)
disableTest=true
;;
-disableUpdate)
disableUpdate=true
;;
*)
nothing="true"
;;
esac
shift
done
if [ "$disableVenusBld" != true ]; then
echo "Starting build"
fi
Parece que você está fazendo manipulação de opções em um script Shell. Aqui está o idioma para isso:
#! /bin/sh -
# idiomatic parameter and option handling in sh
while test $# -gt 0
do
case "$1" in
--opt1) echo "option 1"
;;
--opt2) echo "option 2"
;;
--*) echo "bad option $1"
;;
*) echo "argument $1"
;;
esac
shift
done
exit 0
(Existem algumas convenções para recuar o ;;
, e algumas shells permitem que você dê as opções como (--opt1)
, para ajudar com a correspondência de chaves, mas esta é a idéia básica)
Isso funcionou para mim. Faz exatamente o que você pediu e nada mais (sem opção de processamento). Se isso é bom ou ruim, é um exercício para o cartaz :)
if [[ "$*" == *YOURSTRING* ]]
then
echo "YES"
else
echo "NO"
fi
Isso aproveita o manuseio especial dos colchetes $*
e super-teste [[
… ]]
.
Que tal pesquisar (com curingas) todo o espaço de parâmetros:
if [[ [email protected] == *'-disableVenusBld'* ]]
then
Edit: Ok, ok, então essa não foi uma resposta popular. Que tal este, é perfeito !:
if [[ "${@#-disableVenusBld}" = "[email protected]" ]]
then
echo "Did not find disableVenusBld"
else
echo "Found disableVenusBld"
fi
Edit2: Ok, ok, talvez isso não seja perfeito ... Pense que funciona somente se -param estiver no início da lista e também corresponder -paramXZY ou -paramABC. Eu ainda acho que o problema original pode ser resolvido muito bem com manipulação de string bash, mas eu não tenho muito rachado aqui ... -Pode você?
disCopperBld=
for x; do
if [ "$x" = "-disCopperBld" ]; then disCopperBld=1; break; fi
done
if [ -n "$disCopperBld" ]; then
...
fi
Se você precisar testar apenas os parâmetros que começam em $3
, faça a pesquisa em uma função:
## Usage: search_trailing_parameters NEEDLE NUM "[email protected]"
## Search NEEDLE amongst the parameters, skipping $1 through ${$NUM}.
search_trailing_parameters () {
needle=$1
shift $(($2 + 2))
for x; do
if [ "$x" = "$needle" ]; then return 0; fi
done
return 1
}
if search_trailing_parameters -disCopperBld 2 "[email protected]"; then
...
fi
Mas eu me pergunto por que você está tentando fazer isso em primeiro lugar, não é uma necessidade comum. Normalmente, você processaria opções em ordem, como na resposta de Dennis à sua pergunta anterior .