declare -r is_debug true
if [ "$is_debug" = true ]; then
printf "%s\n", "is debug"
else
printf "%s\n", "is not debug"
fi
declare -p is_debug
echo "${is_debug-isunset}"
saída:
jian@jian:~/Desktop/pg_src/src4/postgres$ bash /home/jian/scratch/scratchpads/47a6066b9dfaca1c2b13ea2e99f4e929/scratch.sh
is not debug
,declare -r is_debug
isunset
jian@jian:~/Desktop/pg_src/src4/postgres$ bash --version
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
declare -p is_debug
echo "${is_debug-isunset}"
estou confuso com ,declare -r is_debug
a saída. espero que retorne declare -r is_debug
.
Declara duas variáveis somente leitura
is_debug
etrue
sem definir seus valores. A menos que sejam chamados dentro de uma função, eles manterão seu valor original, se houver. Se chamada dentro de uma função, uma nova variável local sem valor será instanciada (a menos que a variável já tenha sido declarada previamente naquele escopo comlocal
/typeset
/declare
).Você provavelmente deseja:
Ou de forma mais portável (e não tornando a variável local se chamada dentro de uma função):
Igual a:
Ou
Imprime
is debug
seguido por uma nova linha seguida por uma vírgula, essa vírgula não sendo seguida por uma nova linha, então a próxima saída será anexada a ela.Você provavelmente deseja:
Ou:
Ou:
(que adiciona a nova linha por si só)
Ou:
como
echo
acontece ao juntar seus argumentos com um espaço antes de imprimi-los.Embora
printf
seja geralmente melhor (mais confiável e portátil) do queecho
, não há problema em usarecho
neste caso, pois sabemos que o primeiro argumento não começa com-
, todos os argumentos contêm caracteres somente ASCII e nenhuma barra invertida.A vírgula é usada para separar coisas na expansão de chaves no estilo csh:
Aqui, exceto em zsh, você poderia (não que deveria) escrever:
E em expressões aritméticas no estilo Korn (uma sintaxe semelhante a C)
(nem todos os shells suportam
,
suas expressões aritméticas e observe que no ksh93 ele pode entrar em conflito com o,
caractere raiz de ponto flutuante em localidades onde é vírgula em vez de ponto).Mas de outra forma não é usado para separar argumentos de comandos. Os argumentos dos comandos são separados por espaços em branco (no caso do bash, os caracteres que são classificados como em branco no código do idioma e que são codificados em um byte, que inclui espaço, tabulação e às vezes o caractere de espaço inseparável).
Talvez você esteja confundindo com a
printf
função daawk
linguagem que também é semelhante ao C. Emawk
, você escreveria:Como em C você escreveria:
(o parêntese também pode ser usado em
awk
).Mas a sintaxe da linguagem shell é bem diferente da maioria das outras linguagens e em particular do C/awk.
Em shells, aspas não são usadas para introduzir constantes de string (tudo é string em shells), mas para remover o significado especial que alguns caracteres têm na linguagem.
Por exemplo, em:
As aspas (aqui usando aspas simples, pois
"..."
são melhor reservadas para coisas que incluem expansões) são usadas para remover seu significado especial para o shell para o caractere de barra invertida (que também é um operador de aspas na sintaxe do shell) e o espaço caractere, que é usado para separar argumentos de comandos, como vimos.Também poderíamos citar tudo, menos os caracteres que precisam manter seu significado especial:
Ou:
Onde todos os caracteres, exceto os dois espaços que separam esses 3 argumentos, são citados.
Ou cite apenas aqueles que precisam perder o significado especial:
Ou:
Essa é toda a sintaxe do shell que acabará fazendo exatamente a mesma coisa: execute o
printf
comando comprintf
e%s\n
comois debug
três argumentos separados.E espero que isso esclareça por que mover essa vírgula para dentro ou para fora das aspas não faz absolutamente nenhuma diferença, essa vírgula não tem nenhum significado especial na sintaxe do shell, pois não é usada como parte da expansão de colchetes ou dentro de uma expressão aritmética.
Para obter mais detalhes sobre o que são os caracteres especiais e os operadores de aspas em vários shells, consulte: Como usar um caractere especial como normal em shells Unix?