
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 bash
uma 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 ... esac
para 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' esacIsto 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 embash
.
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 test
ao valor fornecido. Se for bem-sucedido (se o valor for um nome de variável válido), ele corresponderá ao if
teste e ecoará sim, caso contrário, ecoará não.