Por que não posso executar este script?

0
$ sh bashtrrrrrr 

# whats my pub. ip?
bashtrrrrrr: line 19: unexpected EOF while looking for matching '''
bashtrrrrrr: line 20: szintaktikai hiba:  váratlan fájl vég


$  cat bashtrrrrrr 
#!/bin/bash

echo '
# what's my pub. ip?
alias myip="curl -s "http://checkip.dyndns.org/" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | head -1"

# shorten ssh connection with tsocks
function t() { read THEIP; tsocks ssh root@$THEIP; }

# red/green terminals regarding exit code
export PROMPT_COMMAND='PS1="'
if [[ \$? = "0" ]];
then echo "\[\033[0;32m\]";
else echo "\[\033[0;31m\]";
fi'[\u@\h \w]\[\e[m\] "'

export PS1

' >> /home/USER/.bashrc

o que estou perdendo?

    
por LanceBaynes 14.06.2011 / 13:15

3 respostas

6

Também colocando o comando echo '...' inteiro em

cat  <<'EOF' >> /home/USER/.bashrc

...

EOF

ajudaria você a livrar-se das muitas citações internas.

    
por 14.06.2011 / 14:13
11

Como as outras respostas mencionam, o problema são citações aninhadas.

Eu sugiro que você revise como as citações funcionam no bash . Em suma, citações (de qualquer tipo, aspas simples ' , aspas duplas " ou backticks ') são quase sempre combinados com a primeira ocorrência de uma citação do mesmo tipo; você tem que escapar uma cotação para não corresponder (mas você não pode escapar de aspas simples ' ).

Então, (1) o apóstrofo em what's fecha a aspa simples em echo ' :

echo '
# what's my pub. ip?

Em outras palavras, seu comando echo termina depois de ... ip? e o restante é imediatamente executado por bash como um comando, que aparentemente não é o que você quis dizer.

Como a resposta de Rajish ' sugere, usando aqui-documentos resolve muitas das citações questões:

echo >> /home/USER/.bashrc <<'__EOF__'
# what's my pub ip?
echo "we can nest quotes in here"
__EOF__

(2) Depois, como já foi reportado na resposta do ultrasawblade , as citações nesta linha fazem não corresponde corretamente:

alias myip="curl -s "http://checkip.dyndns.org/" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | head -1"

Você provavelmente quer o primeiro e o último " (aspas duplas) caracteres na linha para combinar, mas bash combina com eles na ordem eles são encontrados na linha (da esquerda para a direita), então as aspas duplas left de "http://... fecha as aspas depois de alias myip=" . Da mesma forma, | grep -o e | head -1 são considerados dentro aspas e http://... e [0-9]*\.... não são . (Isso não tem sérias conseqüências sintáticas neste caso, além de grep não vê as barras invertidas, mas lembre-se de que futuro.)

Uma solução é escapar das aspas duplas (e também das barras invertidas, como barras invertidas não perdem seu significado especial entre aspas duplas):

alias myip="curl -s \"http://checkip.dyndns.org/\" | grep -o \"[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\" | head -1"

Outra solução alternativa, que funciona nesse caso, é usar aspas simples ' em vez disso; para definir o alias:

alias myip='curl -s "http://checkip.dyndns.org/" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | head -1'

ou para os comandos na definição de alias:

alias myip="curl -s 'http://checkip.dyndns.org/' | grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' | head -1"

(3) Finalmente, nas linhas:

export PROMPT_COMMAND='PS1="'
if [[ \$? = "0" ]];

O caractere ' (aspas simples) após PROMPT_COMMAND= é interpretado como o início de uma nova string de várias linhas com aspas simples, que termina na linha:

fi'[\u@\h \w]\[\e[m\] "'

Assim, outra string citada individualmente é iniciada pelo caractere ' em a última linha, mas o bash nunca vê uma cota única correspondente. Assim você obter o erro:

unexpected EOF while looking for matching '''
    
por 14.06.2011 / 15:11
1

Bem, um problema é esta linha:

myip="curl -s "http://checkip.dyndns.org/" | grep -o "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" | head -1"

bash é confundido pelas aspas no meio da string. Quando você coloca "aspas entre aspas", você geralmente quer escapar delas, assim:

myip="curl -s \"http://checkip.dyndns.org/\" | grep -o \"[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\" | head -1"
    
por 14.06.2011 / 13:36

Tags