Ajuda a decompor esta linha no script bash

2

Eu precisava de ajuda para entender o que essas duas linhas significam. Eu preciso fazer algumas alterações em um script bash para o meu estágio, e desde que eu comecei a ler sobre bash hoje, estou tendo dificuldade em entender o que isso significaria.

node="\\$1"

echo $node'echo $2|sed 's/\//\\/g''

Obrigado antecipadamente

    
por iman453 05.09.2010 / 06:28

3 respostas

4

Esta linha adiciona duas barras invertidas ao primeiro argumento do script. A primeira barra invertida em cada par escapa do segundo.

node="\\$1"

Esta linha pega o resultado do anterior e acrescenta o resultado de substituir cada uma das barras no segundo argumento por duas barras invertidas.

echo $node'echo $2|sed 's/\//\\/g''

Se você fosse chamar seu script assim:

scriptname abc /def/ghi/jkl

então $node seria "\\ abc" e o seguinte seria ecoado:

\abc\def\ghi\jkl

Os $1 e $2 são referidos como parâmetros posicionais e representam o primeiro e o segundo argumentos para o seu script. Se você quisesse se referir a todos eles juntos, independentemente de quantos (até o limite permitido pelo seu sistema), você usaria $@ ou $* .

Aqui está uma maneira melhor de escrever essas duas linhas:

node='\'"$1"

Usando aspas simples ao redor das barras invertidas, você não precisa escapar delas. Usar aspas duplas em torno do parâmetro posicional permite que ele seja expandido.

echo $node$(echo $2 | sed 's|/|\\|g')

Usar $() em vez de backticks é mais legível, eles podem ser facilmente aninhados e as citações e escapes são simplificados. Usando um delimitador alternativo (neste caso, o símbolo de pipe) com sed você não precisa escapar da barra e a coisa toda é mais legível. As barras invertidas ainda precisam ser escapadas nesse caso, pois sed está processando-as em vez de Bash.

Se você não estiver familiarizado com $() (ou backticks), eles executam a substituição de comando, o que significa que a saída do (s) comando (s) incluído (s) é substituída em seu lugar.

Você pode não estar familiarizado com sed . É um utilitário que é externo ao Bash (ou outros shells) que pode receber um fluxo de caracteres e editá-los. O comando específico em uso aqui é s , que significa substituto. Ele substituirá o que é encontrado entre os segundo e terceiro delimitadores (geralmente barras, mas você pode usar quase qualquer caractere) para o padrão entre o primeiro e o segundo delimitadores. O g é um modificador que faz com que a substituição seja feita globalmente (ou seja, sempre que ocorre na linha de entrada). O processo é repetido para cada linha de entrada. No seu exemplo, há apenas uma linha de entrada - a saída do eco.

    
por 05.09.2010 / 08:16
1

1a linha: o nó é um conjunto de variáveis da linha de comando. Então, se você fizer

runme.sh test
O nó

será igual a "\ test". A primeira barra escapa da segunda barra, tratando-a como uma barra literal em vez de um modificador especial.

Em seguida, substitui qualquer barra invertida no nome por duas barras, assim

> runme.sh test/ing

\test\ing

Então, isso é provavelmente interpretado por outro programa, que interpenetra os cortes, exigindo assim que haja dois deles.

    
por 05.09.2010 / 06:36
1

Não está claro quais partes dessas linhas você está tendo dificuldade em entender, por isso vou tentar explicar quais são as partes mais difíceis.

O script em que você está trabalhando leva pelo menos dois argumentos. Esses argumentos são acessados dentro do script pelos nomes $ 1 e $ 2 . Na primeira linha, a primeira barra invertida escapa do caractere após ela, a segunda barra invertida, para que o par seja avaliado como uma barra invertida literal. O mesmo é verdade para o segundo par de barras invertidas. O $ 1 é substituído pelo valor do primeiro argumento do script. Se o script for executado como

myscript apple banana/cantaloupe

o valor de node será "\\ apple", sem as aspas.

Comandos dentro de back carrapatos (') são executados, então o back carrapato e os comandos fechados são substituídos pela saída desses comandos. O comando sed substitui cada barra no seu fluxo de entrada por um par de barras invertidas. Como $ 2 neste exemplo é "banana / melão", o resultado dos comandos dentro dos retrocessos seria "banana \\ cantaloupe". A saída da segunda linha é o valor do concatenado com o resultado da expressão de retrocesso, ou "\\ applebanana \\ cantaloupe".

    
por 05.09.2010 / 08:42

Tags