Erros de sintaxe em um script bash executado a partir do tcsh

0

Eu escrevi a linha abaixo para verificar se o primeiro ou o segundo campo de uma lista de números é igual a 146.

Eu quero executar a linha de tcsh , com uma linha interpretada por bash .

Qual é o problema aqui?

echo $numbers
146 146 0 16 16 10 42 12 10 32 32 3 2 32 26
tcsh

bash -c 'for i in 1 2; do if [ 146 = 'echo $numbers | cut -f$i  -d' ' ' ]; then echo "NUM is OK "; fi done'

Os erros:

' ]; then echo "NUM is OK "; fi done: -c: line 0: unexpected EOF while looking for matching '''
' ]; then echo "NUM is OK "; fi done: -c: line 1: syntax error: unexpected end of file
    
por yael 21.10.2012 / 14:46

3 respostas

2

O problema é com aspas simples (usadas para envolver todo o conjunto de comandos). A diferença entre aspas simples e aspas duplas é que, entre aspas duplas, as variáveis e os comandos de retrocesso serão substituídos por seus valores, mas, nas aspas simples, a string será tratada como está.

Você pode usar:

bash -c "for i in 1 2; do if [ 146 = 'echo $numbers | cut -f$i -d' ' ' ]; then echo 'NUM is OK '; fi done"
    
por 21.10.2012 / 15:45
4

Existem alguns problemas com o seu "script", sendo o principal deles o ' , que precisaria de alguma forma de escape. Dentro de backticks dentro de uma string entre aspas, fica peludo.

Você poderia evitar isso completamente usando $() em vez de backticks e não usando aspas duras para o delimitador:

... if [ 146 -eq $(echo $numbers | cut -f$i -d\ ) ]; then ...

Observe que -eq é o predicado apropriado para números e que $numbers precisará ser exportado para que isso funcione.

Escrever um script adequado e chamá-lo de tcsh seria melhor.

    
por 21.10.2012 / 15:49
0

Que tal grep ? Isso é um problema estático ou os números e o critério mudarão?

Se é estático:

echo $numbers | grep -c '(^146\s)|(^\d+\s146\s)'

Isso retorna 0 ou 1, dependendo se houver uma correspondência.

Isso não foi testado, mas deve corresponder ao primeiro ou segundo campo. Existem outros padrões que podem ser mais eficientes, mas devem estar próximos do trabalho.

    
por 21.10.2012 / 15:50

Tags