¿Cómo puedo usar el comando 'grep' para obtener algún valor de los argumentos?

¿Cómo puedo usar el comando 'grep' para obtener algún valor de los argumentos?

En realidad, estoy haciendo alguna tarea de la siguiente manera:

1: Escriba un programa llamado válido que imprima "sí" si su argumento es un nombre de variable de shell válido y "no" en caso contrario:

Lo que estoy haciendo es encontrar algún valor que incluya alguna expresión regular, como [0-9]* usando el comando 'grep'. Pero no tengo idea de cómo obtener algún valor, incluida esa expresión, del argumento que ingresé, ya que el comando 'grep' es básicamente capturar alguna línea en el archivo. Cualquier ayuda será muy apreciada

Respuesta1

Esto no usa grep, pero como punto de referencia, podría usar el =~operador condicional de bash para comparar el primer argumento del script con la clase de expresión regular para unname , que está definida porManual de referencia de bashcomo:

Palabra que consta únicamente de letras, números y guiones bajos, y que comienza con una letra o un guión bajo. Los nombres se utilizan como nombres de funciones y variables de shell.

$ 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

Respuesta2

En bashuna variable válida, el nombre está formado por uno o más caracteres de un solo byte, siendo el primero alfabético o guión bajo y los restantes, si los hay, alfabéticos, 0123456789 o guión bajo.

Por ejemplo, Stéphanees un nombre de variable válido solo en configuraciones regionales donde ées de un solo byte como en ISO-8859-1 donde es el byte 0xE9, no en UTF-8 donde está codificado como 0xC3 0xA9.

Podrías hacer 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

Respuesta3

El primer argumento de la línea de comando está disponible como $1. Un nombre de variable de shell válido comienza con un carácter alfabético (o guión bajo) y continúa con caracteres alfanuméricos (o guiones bajos).

Dos patrones de concha que coinciden con uninválidoel nombre de la variable de shell es

[!a-zA-Z_]*

y

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

Puede utilizarlo case ... esacpara comparar patrones con el valor de una variable.

Advertencia de spoiler:

#!/bin/sh
LC_ALL=C
caso "$1" en
    [!a-zA-Z_]*|[a-zA-Z_]*[!a-zA-Z_0-9]*|"")
        eco 'NO'
        ;;
    *)
        eco 'SÍ'
esac
Esto también responde "NO" para una variable cuyo nombre está vacío. Tenga en cuenta que esto utiliza patrones globales de shell, no expresiones regulares, y que se ejecuta en cualquier shell POSIX, no solo en bash.

Pruebas:

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

Respuesta4

#!/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

Esto intentará asignar el valor testal valor proporcionado. Si tiene éxito (si el valor es un nombre de variable válido), coincidirá con la ifprueba y responderá sí; de lo contrario, responderá no.

información relacionada