cut comando dentro se a instrução falhar

2

Dentro de um script bash, eu tenho uma declaração if. Essa instrução avalia se uma parte específica de uma string (contida em uma variável) é igual a outra string. Eu uso um comando cut para isolar a parte da string que eu quero comparar. Eu tentei algumas opções diferentes, mas esta é a que eu sinto que deveria funcionar. mas isso não acontece:

Digamos que $VAR1 = "ABCDEFGHIJKLMN.csv"

if [ "$VAR1"| cut -c 7-18 = "GHIJKLMN.csv" ]; then
..do stuff..

Só para ter certeza de que testei a saída de "$VAR1"| cut -c 7-18 e resulta na mesma string com a qual estou comparando.

Alguém sabe por que isso não funciona?

    
por matv1 06.03.2018 / 01:21

2 respostas

5
if [ "$VAR1"| cut -c 7-18 = "GHIJKLMN.csv" ]; then

O que isto faz é executar [ "$VAR1" e canalizar a saída para cut -c 7-18 = "GHIJKLMN.csv" ] . [ falhará porque exige que seu último argumento seja ] e cut falhará porque provavelmente nem = nem ] são arquivos.

Vou adivinhar o que você queria:

if [ "$(echo "$VAR1" | cut -c 7-18)" = "GHIJKLMN.csv" ]; then

Observe como eu envolvo o comando em "$()" . Isso faz com que ele execute e substitua seu lugar pela saída. As cotações são importantes, portanto, a saída não é dividida em vários argumentos para [ .

Seguindo o que acredito serem as práticas recomendadas para o bash, recomendo que você faça isso:

if [[ "$(cut -c 7-18 <<< "$VAR1")" = "GHIJKLMN.csv" ]]; then

Isso evita interpretação especial de $VAR1 por echo (dependendo do conteúdo, pode ser confundido com opções) e chamando 2 executáveis desnecessários, [ e echo . Algo especial para notar aqui é que você realmente não precisa de nenhuma das aspas que usei. [[ é uma sintaxe especial do bash, e mesmo se a substituição tivesse espaços, o bash não dividiria a palavra. Também não dividiria o que foi dado a <<< . GHIJKLMN.csv não tem nenhum espaço em branco ou caracteres especiais, por isso também seria bom. Em caso de dúvida, é um bom hábito citar tudo.

Você também pode ter pulado a chamada para cut ao fazer isso:

if [[ "${VAR1:6:12}" = "GHIJKLMN.csv" ]]; then

Agora, tudo é feito no bash sem executar nenhum outro programa. Nessa sintaxe, em vez de fornecer o intervalo de caracteres desejado, como você fez com cut , você fornece o deslocamento com base em 0 para o primeiro caractere e o número de caracteres que deseja. Isso é 7 - 1 porque os índices de cut começam com 1 e 12 porque o intervalo 7-18 é inclusivo, então 18 - 7 + 1.

Acabei de ver, seu $VAR1 é "ABCDEFGHIJKLMN.csv" . Desde que você cortou até o final, você realmente não precisa especificar a contagem:

if [[ "${VAR1:6}" = "GHIJKLMN.csv" ]]; then
    
por JoL 06.03.2018 / 03:12
2

Isso funciona:

#!/bin/bash

echo 'Beginning of script'
VAR1='ABCDEFGHIJKLMN.csv'
if [ $(echo "$VAR1" | cut -c 7-18) == "GHIJKLMN.csv" ]; then
    echo 'If condition triggered.'
fi
echo 'End of script'

Isso também funciona:

#!/bin/bash

echo 'Beginning of script'
VAR1='ABCDEFGHIJKLMN.csv'
VAR2=$(echo "$VAR1" | cut -c 7-18)
if [ "$VAR2" == "GHIJKLMN.csv" ]; then
    echo 'If condition triggered.'
fi
echo 'End of script'
    
por Kevin Li 06.03.2018 / 01:31