shell script para testar a condição na cadeia passada

0

condição string começa com alfabetos superiores ou inferiores ou sublinhado por exemplo _abc ou xyz ou Abc

string pode conter dígitos após o primeiro caractere como _f9 ou f10 ou car20 ou top10cars

string nunca deve conter caracteres especiais como! @ # $% ^ & * () + - =

aqui meu script minúsculo

if [[ $1 =~ ^[A-Za-z_]+$ ]]; then
  echo it matches
else
  echo does_not match
fi

quando eu passo argumentos como apenas & ou * ou (, o script não funciona, às vezes o cursor nunca volta, preciso pressionar ctrl + c

for example    ./script.sh (abc 
               ./script.sh &&
               ./script.sh &abc

está errado com o script

    
por user143252 25.09.2017 / 19:00

2 respostas

2

Citações.

No script, use "$1" em vez de apenas $1 .

Na linha de comando, use

./script '*(ontehu'

em vez de

./script *(ontehu
  • ./script.sh (abc Este é um erro de sintaxe na gramática da shell.

  • ./script.sh && Isso faz com que o shell pense que existe um AND condicional na linha de comando e espera algo do lado direito do operador && .

  • ./script.sh &abc Estes são dois comandos: ./script iniciado como um processo em segundo plano (com & ) e o comando abc .

Em todos esses casos, o argumento deve ser citado (entre aspas, idealmente, a menos que você precise que o shell insira o valor de uma variável shell, caso em que deve ser citado em duplicidade).

Seu script:

if [[ $1 =~ ^[A-Za-z_]+$ ]]; then
  echo it matches
else
  echo does_not match
fi

Citar $1 :

if [[ "$1" =~ ^[A-Za-z_]+$ ]]; then
  echo it matches
else
  echo does_not match
fi

Permitir dígitos no final do valor:

if [[ "$1" =~ ^[A-Za-z_][A-Za-z0-9_]+$ ]]; then
  echo it matches
else
  echo does_not match
fi

Faça um relatório adequado dos erros (isso é extra):

if [[ "$1" =~ ^[A-Za-z_][A-Za-z0-9_]+$ ]]; then
  printf '"%s" is a valid variable name\n' "$1"
else
  printf '"%s" is not a proper variable name\n' "$1" >&2
  exit 1
fi
    
por 25.09.2017 / 19:09
1

Isso porque esses são caracteres reservados.

& significa executar o comando em segundo plano

* resolve todos os arquivos / pastas no diretório atual, que são passados como argumentos

() é usado para preferências de ordem de comando ou declarações de função

Se você quiser esses caracteres na string, coloque-os entre aspas "" ou ""

    
por 25.09.2017 / 19:10