Eu gostaria de garantir que, em um determinado ponto de um script, após source
um arquivo de configuração, várias variáveis sejam definidas e, se não estiverem, parem a execução, informando o usuário sobre a variável ausente. eu tentei
for var in $one $two $three ; do
...
mas se, por exemplo, $two
não estiver definido, o loop nunca será executado $two
. A próxima coisa que tentei foi
for var in one two three ; do
if [ -n ${!var} ] ; then
echo "$var is set to ${!var}"
else
echo "$var is not set"
fi
done
Mas se dois não estiverem definidos, ainda recebo "dois está definido como" em vez de "dois não está definido".
Como posso ter certeza de que todas as variáveis necessárias estão definidas?
Atualização / solução: Eu sei que há uma diferença entre "conjunto" e "conjunto, mas vazio". Agora uso (graças a /programming//a/16753536/3456281 e as respostas a esta pergunta) o seguinte:
if [ -n "${!var:-}" ] ; then
portanto, se var
estiver definido, mas vazio, ainda será considerado inválido.
fonte
set -u
ao início do seu script para finalizá-lo imediatamente quando uma variável não definida for usada.Respostas:
Erro de citação.
Para o futuro: Configuração
antes de executar o código teria mostrado o problema. Em vez de adicionar isso ao código, você pode chamar seu script com
fonte
set -- $(IFS=, ; echo $cs)
? O tipo de pessoa que precisa perguntar aqui porif [ -n ${!var} ] ; then
que não funciona? Provavelmente não.A única coisa que você precisa são aspas no seu teste:
Funciona para mim.
fonte
Se você deseja que o programa seja parado:
Isso fará o truque. Cada uma das mensagens após o ponto de interrogação é impressa
stderr
e o shell pai morre. Bem, ok, então nem todas as mensagens - apenas uma - apenas a primeira que falha imprime uma mensagem, porque o shell morre. Eu gosto de usar esses testes assim:Eu tinha muito mais a dizer sobre isso aqui .
fonte
Você pode adicionar
até o início do seu script para finalizá-lo quando tentar usar uma variável não definida.
Um script como
vai resultar em
Se você estiver usando
bash
, o erro será semelhante a este:fonte
set -u
evita exatamente o tipo de erro que o OP está tentando evitar e (ao contrário de todas as outras soluções) não se limita a um conjunto específico de variáveis. Na verdade, é uma precaução útil para quase todos os scripts de shell fazer com que falhem com segurança, em vez de fazer coisas inesperadas quando uma variável está desabilitada. Este artigo é uma referência útil sobre o tópico.set -u
Eu acho que poderia ser usado também, mas não é tão flexível quanto a expansão adequada dos parâmetros (veja minha pergunta atualizada). E comset -u
isso eu teria que fazer um acesso simulado a todas as variáveis de destino se eu quiser verificar a presença delas em um só lugar.Uma solução que é maximamente amigável testa todos os requisitos e os reporta em conjunto, em vez de falhar no primeiro e exigir que o processo funcione corretamente:
Uso uma variável de matriz para rastrear quais variáveis não foram definidas e uso o resultado para compor uma mensagem voltada para o usuário.
Notas:
${required_vars[@]}
nofor
loop principalmente por hábito - eu não recomendaria incluir nenhum metacaractere de shell nos seus nomes de variáveis!${#missing_vars[@]}
, porque sempre é um número inteiro, mesmo que você seja perverso o suficiente para desconsiderar o conselho anterior.%q
ao imprimir;%s
normalmente seria suficiente.>&2
, portanto, não é canalizada para os comandos downstreamfonte
bash
4.2 permite testar se uma variável está definida com o-v
operador; uma variável não configurada e uma variável configurada para a sequência vazia são duas condições diferentes:fonte
-v
leva o nome de uma variável, por issofor var in one two three; [[ -v $var ]] && ...; done
iria verificar se cada umone
,two
ethree
são definidos em sequência.Acho que, se você quer dizer
not set
, a variável nunca deve ser inicializada. Se você usar[ -n "${!var}" ]
, a variável vazia liketwo=""
falhará enquanto estiver definida . Você pode tentar isso:fonte
Uma solução concisa (embora um pouco hacky), para lidar com o caso em que o
source
script d pode definir um valor nulo para as variáveis, é inicializar as variáveis para um valor especial antes de buscar o script e depois verificar esse valor posteriormente , por exemplofonte
Estendi a resposta do @ mikeserv .
Esta versão leva uma lista de variáveis para verificar a presença, imprimindo o nome da variável ausente e acionando uma chamada para uso () por erro.
Exemplo de saída quando um valor está ausente:
Observe que você pode alterar a variável chamada VALUE para um nome alternativo que melhor se adapte à saída desejada.
fonte