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.