Estou tentando escrever um script em que quero verificar se algum dos parâmetros passados para um script bash corresponde a uma seqüência de caracteres. A maneira como eu o configurei 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: Tentei esse pedaço de código e chamei o script com a opção -disableVenusBld, mas ele ainda imprime "Iniciando a compilação". 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
linux
unix
bash
shell-script
iman453
fonte
fonte
#! /bin/sh -
ao topo o que você incluiu lá, tornei o script executável e depois./t.sh
imprimi "Iniciando a compilação", mas./t.sh -disableVenusBld
não imprime nada.Respostas:
Parece que você está manipulando opções em um script de shell. Aqui está o idioma para isso:
(Existem algumas convenções para recuar o
;;
e algumas conchas permitem que você dê as opções como(--opt1)
, para ajudar na correspondência entre chaves, mas essa é a idéia básica)fonte
shift
declaração é usada quando o número de argumentos para um comando não é conhecido antecipadamente, por exemplo, quando os usuários podem fornecer quantos argumentos quiserem. Nesses casos, os argumentos são processados em umwhile
loop com uma condição de teste de$#
. Essa condição é verdadeira desde que o número de argumentos seja maior que zero. A$1
variável e ashift
instrução processam cada argumento. O número de argumentos é reduzido cada vez queshift
é executado e, eventualmente, se torna zero, após o qual owhile
loop sai. fonteecho $1 | sed
processamento de valor de argumento adicional .Isso funcionou para mim. Faz exatamente o que você pediu e nada mais (sem processamento de opções). Se isso é bom ou ruim, é um exercício para o pôster :)
Isso tira proveito do manuseio especial
$*
e dos suportes de super teste[[
… do bash]]
.fonte
$*
para$@
, uma vez que a sequência a ser testada pode ter espaços e adicionar um link à documentação do bash sobre isso.bash -c 'echo args=$*; [[ "$@" == "bar" ]] && echo YES || echo NO' -- foo bar
your string
. Eu acho que você precisa fazer o que é sugerido por esta resposta . ou seja:bash -c 'echo args=$*; for i in "$@" ; do [[ $i == "bar" ]] && echo "Is set!" && break ; done' -- bar foo
funcionaria.create a new certificate
e "sua string" forcat
, isso reportará uma correspondência porquecertificate
contémcat
.Que tal pesquisar (com caracteres curinga) todo o espaço de parâmetros:
Edit: Ok, ok, então essa não era uma resposta popular. Que tal este, é perfeito !:
Edit2: Ok, ok, talvez isso não seja perfeito ... Acho que funcionará apenas se -param estiver no início da lista e também corresponderá a -paramXZY ou -paramABC. Ainda acho que o problema original pode ser resolvido muito bem com a manipulação de strings do bash, mas ainda não o resolvi aqui ... -Pode?
fonte
${@#
) faz?$@
é uma variável especial que contém todos os argumentos da linha de comando? Bem, eu apenas usei a manipulação de string Bash nessa variável para remover a substring "-disableVenusBld" e depois comparo-a ao original$@
. Então, se$@
iguais-foo -bar
, então${@#-disableVenusBld}
ainda seria-foo -bar
, então eu posso ver que a bandeira que eu estou procurando não está presente. No entanto, se$@
iguais,-foo -disableVenusBld -bar
então${@#-disableVenusBld}
seria o-foo -bar
que não é igual$@
, me dizendo que a bandeira que estou procurando está presente! Legal eh!Se você precisar testar apenas os parâmetros iniciados em
$3
, faça a pesquisa em uma função:Mas eu me pergunto por que você está tentando fazer isso em primeiro lugar, não é uma necessidade comum. Geralmente, você processa as opções em ordem, como na resposta de Dennis à sua pergunta anterior .
fonte