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

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

Na verdade, estou fazendo uma tarefa a seguir:

1: Escreva um programa chamado válido que imprima "sim" se seu argumento for um nome de variável shell válido e "não" caso contrário:

O que estou fazendo é encontrar algum valor que inclua alguma expressão regular, como [0-9]* usando o comando 'grep'. Mas não tenho ideia de como obter algum valor incluindo essa expressão do argumento que inseri, já que o comando 'grep' serve basicamente para capturar alguma linha no arquivo. Qualquer ajuda será realmente apreciada

Responder1

Isso não usa 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 a name, que é definida peloManual de referência do Bashcomo:

Uma palavra que consiste apenas em letras, números e sublinhados e começa com uma letra ou sublinhado. Os nomes são usados ​​como variáveis ​​de shell e nomes de funções.

$ 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

Responder2

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

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

Você poderia 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

Responder3

O primeiro argumento da 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 caracteres alfanuméricos (ou sublinhados).

Dois padrões de shell que correspondem a uminválidoo nome da variável shell é

[!a-zA-Z_]*

e

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

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

Aviso de spoiler:

#!/bin/sh
LC_ALL=C
caso "$1" em
    [!a-zA-Z_]*|[a-zA-Z_]*[!a-zA-Z_0-9]*|"")
        ecoar 'NÃO'
        ;;
    *)
        ecoar 'SIM'
esac
Isto também responde "NÃO" para uma variável cujo nome está vazio. Observe que isso está usando padrões globbing de shell, não expressões regulares, e que é executado em qualquer shell POSIX, não apenas em bash.

Teste:

$ ./script.sh _ae
YES
$ ./script.sh 0a9oe
NO
$ ./script.sh aoeat
YES
$ ./script.sh aoeat-aoe
NO

Responder4

#!/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 testao valor fornecido. Se for bem-sucedido (se o valor for um nome de variável válido), ele corresponderá ao ifteste e ecoará sim, caso contrário, ecoará não.

informação relacionada