O bash reconhece uma declaração de variável como string se você não colocar as aspas?

5
name=Jackson
echo $name

Isto irá mostrar Jackson.

name="Jackson"
echo $name

Isso também mostrará Jackson.

Então eu suponho, colocando aspas em torno de uma variável que está fazendo uma string. Qual seria o nome de Jackson tecnicamente? Também seria reconhecido como uma string?

    
por John 03.11.2013 / 11:50

3 respostas

5

As variáveis de ambiente do Linux são sempre strings. As aspas são necessárias apenas se você tiver caracteres especiais (metacaracteres de shell ou espaço em branco) na sua string. Os metacaracteres da casca são:

<>()[]{}*?$|&#\;''"

Com $, \ e 'as aspas duplas não são suficientes, pois são até mesmo expandidas dentro delas. Lá você precisa de aspas simples ou escapar com \.

Como foi observado em um comentário, bash tem variáveis tipadas especiais, mas elas raramente são necessárias e, por padrão, todas as variáveis bash são strings também.

    
por 03.11.2013 / 12:04
4

Bash não é strongmente tipado; 1 a única diferença significativa é entre os tipos escalar e composto (matrizes). Os escalares são sempre considerados strings , mas existem "strings numéricas" que podem ser usadas aritmeticamente:

a="5"
b=10

echo "$a + $b = "$(($a+$b)); 

Uma "string numérica" é simplesmente uma string que contém apenas dígitos e, portanto, pode ser convertida em um valor inteiro. Todos os valores escalares no bash ainda são apenas strings e as aspas na declaração são irrelevantes. a=5 é EXCATLY o mesmo que a="5" . Se você comparar $a e $b usando (por exemplo) -lt , eles serão tratados como números. Se você os comparar usando < , eles serão tratados lexicograficamente. É o operador / contexto que faz a determinação, não uma característica da variável.

Você também pode declarar uma variável com um "sinalizador inteiro", e isso fará com que o valor declarado seja interpretado como uma expressão aritmética:

x=10/2
echo "$x" # output: 10/2
declare -i x=10/2
echo "$x" # output: 5
declare -i x=what
echo "$x" # output: 0  

Posteriormente, qualquer coisa atribuída a essa variável será interpretada aritmeticamente:

a=5
declare -i b=10
a=$a/5
b=$b/5
echo "$a $b" #output: 5/5 2
a=hello
b=world
echo $a$b #output hello0

Mas o conteúdo da variável ainda é uma string (numérica). O sinalizador inteiro restringe o conteúdo da string e afeta a interpretação dos valores atribuídos a ela.

1 Não é uma simples digitação dinâmica, como o caso do inteiro declarado demonstra. Talvez possamos chamá-lo de uma espécie de menor digitação de pato .

    
por 03.11.2013 / 12:11
0

existe uma diferença: tente

unset name
name="Michael Jackson" ; echo "$name" 

e

unset name #to reset name, see comments
name=Michael Jackson ; echo "$name"

É muito diferente: no dia 2, ele tenta iniciar o comando "Jackson", passando o ambiente "name = Michael". Então, ele vai reclamar que "Jackson: comando não encontrado" Eu tenho que adicionar o unset name ao nome "reset", como parte da name=Michael da próxima linha só será passada para o comando "Jackson" (e somente para esse comando) e, portanto, não é feito no nível de shell de chamada ! (que, portanto, ainda teria o name="Michael Jackson" do primeiro comando, se não o ajustássemos de volta para "" antes de nossa segunda tentativa. Então, o "echo $ name" ainda exibiria "Michael Jackson" se não o tivéssemos esqueça essa primeira tentativa.)

No normal, sempre coloca aspas duplas ao redor, especialmente quando você usa variáveis.

cd "${var}" 

é muito melhor que

cd $var 

A segunda versão iria silenciosamente para o homedir em vez de protestar se $ var não estivesse definido ...

Em seguida, retire apenas as aspas duplas circunvizinhas somente quando você sabe que você precisa para separar cada elemento da variável, ou seja, em:

for i in $var ; do something_using_i ; done
    
por 04.11.2013 / 18:32

Tags