script bash: se os argumentos forem iguais a essa sequência, defina uma variável como essa sequência


225

Estou fazendo algum script bash e agora recebi uma chamada variável sourcee uma matriz chamada samples, assim:

source='country'
samples=(US Canada Mexico...)

como eu quero expandir o número de fontes (e cada fonte tem seus próprios exemplos), tentei adicionar alguns argumentos para fazer isso. Eu tentei isso:

source=""
samples=("")
if [ $1="country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
   echo "try again"
fi

mas quando eu executei meu script source countries.sh country, não funcionou. O que estou fazendo de errado?


2
como isso não funciona? Ao executá-lo, você recebe um erro ou diz "tente novamente" ou algo mais?
Otho #

2
sim, você pode pensar 'a questão é muito direta'. mas você pensa sobre isso há um tempo. Considere editar sua pergunta para incluir as saídas necessárias e todas as mensagens de erro que você estiver recebendo. +1 por realmente tentar algo e boa formatação de pergunta. boa sorte.
Shellter 15/03/12

Por que esse código é o mesmo que a solução proposta e aceita? Isso é confuso ... Acho que a pergunta inicial não tinha espaços logo após o colchete de abertura e antes do colchete de fechamento da sentença if?
Stef

6
@Stef se você olhar de perto, $1="country"vs$1 = "country"
Será

Respostas:


413

Não se esqueça dos espaços:

source=""
samples=("")
if [ $1 = "country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi

121
Eu não posso acreditar que eu gastei três horas nisso, e era apenas um problema de espaço !!!! ... OBRIGADO @Alex #
Alejandro Alejandro

1
Por que você usa samples="US Canada Mexico..."depois de introduzir a criação da matriz antes samples=(US Canada Mexico...)?
desconhecido utilizador

10
Eu tive problemas com isso quando a variável à esquerda era uma string vazia. Correção foi if [ "$1" = "country" ]; then.
andrewb

8
Ok, é isso. Bash recebe oficialmente meu voto por ser a linguagem de comando mais desatualizada e ainda usada. A sintaxe é tão intuitiva que dói. Realmente não há lugar para isso em 2016+. Autores @Systemd: você pode criar "um shell Linux que não seja ruim" no seu próximo projeto? Vou jogar dinheiro com você.
masi

3
@masi Às vezes acho que a intenção original do unix era "segurança no trabalho através da obscuridade". se as ferramentas fossem enigmáticas de usar, difíceis de entender e geralmente fora do alcance dos grandes lavados, sem o conhecimento interno transmitido do mestre ao padwan, isso garantiria que sempre houvesse trabalho para os "conhecedores". essa filosofia é evidente em toda a construção "RFC" e na linguagem florida usada nos documentos do homem, que, embora tecnicamente lhe digam como usar as ferramentas, realmente estavam lá para cumprir um requisito de ter documentado as ferramentas. pouco mudou.
não sincronizado

184

Você pode usar os operadores "=" ou "==" para comparação de cadeias de caracteres no bash. O fator importante é o espaçamento entre parênteses. O método adequado é que os colchetes contenham espaçamento interno e os operadores contenham espaçamento ao redor. Em alguns casos, diferentes combinações funcionam; no entanto, o seguinte pretende ser um exemplo universal.

if [ "$1" == "something" ]; then     ## GOOD

if [ "$1" = "something" ]; then      ## GOOD

if [ "$1"="something" ]; then        ## BAD (operator spacing)

if ["$1" == "something"]; then       ## BAD (bracket spacing)

Além disso, observe que colchetes duplos são tratados de maneira ligeiramente diferente em comparação com colchetes simples ...

if [[ $a == z* ]]; then   # True if $a starts with a "z" (pattern matching).
if [[ $a == "z*" ]]; then # True if $a is equal to z* (literal matching).

if [ $a == z* ]; then     # File globbing and word splitting take place.
if [ "$a" == "z*" ]; then # True if $a is equal to z* (literal matching).

Espero que ajude!


12

Parece que você deseja analisar os argumentos da linha de comando no seu script bash. Eu pesquisei isso recentemente eu mesmo. Me deparei com o seguinte, que acho que o ajudará a analisar os argumentos:

http://rsalveti.wordpress.com/2007/04/03/bash-parsing-arguments-with-getopts/

Adicionei o trecho abaixo como um tl; dr

#using : after a switch variable means it requires some input (ie, t: requires something after t to validate while h requires nothing.
while getopts ht:r:p:v OPTION
do
     case $OPTION in
         h)
             usage
             exit 1
             ;;
         t)
             TEST=$OPTARG
             ;;
         r)
             SERVER=$OPTARG
             ;;
         p)
             PASSWD=$OPTARG
             ;;
         v)
             VERBOSE=1
             ;;
         ?)
             usage
             exit
             ;;
     esac
done

if [[ -z $TEST ]] || [[ -z $SERVER ]] || [[ -z $PASSWD ]]
then
     usage
     exit 1
fi

./script.sh -t test -r servidor -p senha -v

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.