porque é! caractere usado em scripts de shell [duplicado]

0

Recentemente, encontrei uma situação em que tentei usar ! como um separador de registro para a matriz de strings no script de shell. Quando eu usei no meu shell script, o script foi expandido automaticamente. Um exemplo para reproduzir a situação pode ser como abaixo.

check_variable="Hello"
echo "$check_variable"
Output: Hello
###For multiple strings, I tried to concatenate with ! as a record separator. 
echo "$check_variable !"
Output: echo "$check " > Results.txt

Depois de algumas pesquisas, descobri que ! é, na verdade, um caractere especial e não deve ser usado como separador de registros. Então, exatamente por que ! é usado? Existe alguma maneira de desativar o caractere ! e usá-lo no meu script de shell?

    
por Ramesh 25.03.2014 / 18:48

2 respostas

4

Na verdade, há uma explicação maravilhosa sobre por que ! é usado em aqui . Para entender o comando com mais clareza, fiz os seguintes comandos.

pwd- It gives the present working directory.
!pwd - It executes the previously executed pwd command.

Essa configuração pode ser perigosa, pois há chances de que um usuário execute !rm por engano e, assim, resulte em resultados sem precedentes.

Outro método para testar a eficácia do caractere ! seria

echo "12345647" >> ramesh.txt
cat ramesh.txt
12345647
!echo
cat ramesh.txt
12345647
12345647

Como podemos ver, o comando !echo foi executado e anexou a linha 1234567 ao arquivo.

Embora não seja aconselhável usar os caracteres especiais como separadores de arquivos ou separadores de registros no script, essa configuração pode ser anulada, executando o comando abaixo.

set -H turns it on; 
set +H turns it off.
    
por 25.03.2014 / 18:48
0

Não diretamente relacionado, mas tenha em mente que encerrar as coisas em "" interpola as coisas. Na sua primeira linha:

check_variable="Hello"

Nada na sua string precisa ser interpretado, então por que fazer isso? Isso também vale quando você usa $ check_variable via echo

check_variable='Hello'
echo $check_variable

Isso fará com que o Hello seja impresso conforme o esperado.

Se você DEVE usar um caractere reservado como seu separador, não o cite ao usá-lo via echo:

$ echo $check_variable ! > Results.txt
$ cat Results.txt
Hello !
$ echo '$check_variable !'
$check_variable !

Lembre-se de que, neste caso, echo apenas imprime todos os argumentos que recebe (o! na linha de eco é considerado o segundo argumento) e nem todos os comandos agirão de maneira semelhante. O Bash não o trata como especial neste caso porque A) é um argumento para outro comando, e B) você não está tentando interpolá-lo colocando-o em "". O último eco está lá apenas para mostrar que o uso de "tratará tudo dentro dele como literal - sem interpolação alguma.

Ainda assim, vou repetir os outros e dizer que você deve fazer o que puder para evitar usar caracteres especiais / reservados como algo que não seja o uso pretendido, se possível.

    
por 25.03.2014 / 19:42