Como posso usar o comando 'grep' para obter algum valor dos argumentos?

1

Na verdade, estou fazendo uma tarefa por seguir:

1: Write a program called valid that prints "yes" if its argument is a valid shell variable name and "no" otherwise:

O que eu estou fazendo é que eu quero encontrar algum valor que inclua alguma expressão regular, como [0-9] * usando o comando 'grep'. Mas eu não tenho idéia de como pegar algum valor, incluindo essa expressão do argumento que eu digito, já que o comando 'grep' é basicamente capturar alguma linha no arquivo. Qualquer ajuda será muito apreciada

    
por GideokSeong 30.05.2018 / 22:11

4 respostas

3

Isso não usa o grep, mas como ponto de referência, você pode usar o operador condicional =~ do bash para comparar o primeiro argumento do script com a classe de expressão regular para um name , que é definido pelo Manual de Referência do Bash como:

A word consisting solely of letters, numbers, and underscores, and beginning with a letter or underscore. Names are used as shell variable and function names.

$ cat isvarname
#!/bin/bash
if [ "$#" -ne 1 ]
then
   echo "Usage: $0 a-string"
   exit 1
fi

if [[ "$1" =~ ^[[:alpha:]_][[:alnum:]_]*$ ]]
then
  echo yes
else
  echo no
fi
    
por 30.05.2018 / 22:25
1

Em bash , um nome de variável válido é composto de um ou mais caracteres de byte único, sendo o primeiro alfabético ou sublinhado, e os demais, se houver algum alfabético, 0123456789 ou sublinhado.

Por exemplo, Stéphane é um nome de variável válido somente em locais onde é é de byte único, como em ISO-8859-1, onde é o byte 0xE9, não em UTF-8, onde é codificado como 0xC3 0xA9. / p>

Você pode fazer algo como:

#! /usr/bin/env bash
is_single_byte() {
  local length_in_bytes length_in_chars
  length_in_chars=${#1}
  local LC_ALL=C
  length_in_bytes=${#1}
  ((length_in_bytes == length_in_chars))
}

re='^[[:alpha:]_][[:alnum:]_]*$'
for var do
  if is_single_byte "$var" && [[ $var =~ $re ]]; then
    printf '"%s" is a valid variable name\n' "$var"
  else
    printf '"%s" is not a valid variable name\n' "$var"
  fi
done
    
por 30.05.2018 / 23:00
0

O primeiro argumento de linha de comando está disponível como $1 . Um nome de variável de shell válido começa com um caractere alfabético (ou sublinhado) e continua com alfanuméricos (ou sublinhados).

Dois padrões de shell que correspondem a um nome de variável de shell inválido são

[!a-zA-Z_]*

e

[a-zA-Z_]*[!a-zA-Z_0-9]*

Você pode usar case ... esac para fazer a correspondência de padrões com o valor de uma variável.

Aviso de spoiler:

#!/bin/sh
LC_ALL=C
case "$1" in
    [!a-zA-Z_]*|[a-zA-Z_]*[!a-zA-Z_0-9]*|"")
        echo 'NO'
        ;;
    *)
        echo 'YES'
esac
This also answers "NO" for a variable whose name is empty. Note that this is using shell globbing patterns, not regular expressions, and that it runs in any POSIX shell, not just bash.

Teste:

$ ./script.sh _ae
YES
$ ./script.sh 0a9oe
NO
$ ./script.sh aoeat
YES
$ ./script.sh aoeat-aoe
NO
    
por 30.05.2018 / 22:38
0
#!/bin/bash
var=$1
if [[ $var =~ [\'\$\=\/] || $var =~ \[ ]]; then
    echo 'no'
    exit
fi
declare "$var"=test 2>/dev/null
if [[ ${!var} == 'test' || $1 == 'var' ]]; then
    echo 'yes'
else
    echo 'no'
fi

Isso tentará atribuir o valor test ao valor fornecido. Se for bem-sucedido (se o valor for um nome de variável válido), ele corresponderá ao if test e echo yes, caso contrário, ele irá ecoar não.

    
por 30.05.2018 / 22:25