Verificando extensões em parâmetros de comando?

0

Então, estou executando o Ubuntu e o que quero fazer é verificar se $1 e $2 possuem determinadas extensões e se elas existem. Se eles não existem ou têm a extensão errada, o script termina. Se eles estão certos, então continua com o código.

v1="$1"  
v2="$2"  

if [[ ! "$1"="*.txt" || "$2"="*.dat" || -e "$1" ]]; then  
echo "The file is ending"  
exit  
fi  

echo "Starting rest of code" 

É assim que eu gostaria que funcionasse. Basicamente, ele atribui v1 e v2 aos seus parâmetros de comando respeitados. Em seguida, ele executa uma instrução if para ver se eles atendem aos requisitos. Por exemplo, se $1 não for um arquivo .txt ou se $2 não for um arquivo .dat ou se $1 não existir, ele sairá e exibirá The File is ending . No entanto, se eles atenderem aos requisitos, o código continuará e exibirá Starting rest of code .

Como está agora, não continuará, mesmo que os arquivos corretos sejam inseridos. Em vez disso, sai, não importa o quê.

    
por LAMPnewb 24.09.2015 / 01:33

3 respostas

0

O que você está fazendo errado é verificar $ 1 em relação a '.txt', em que $ 1 não conterá apenas a extensão, mas o nome completo do arquivo. Por exemplo, se houver um arquivo chamado

file1.txt

então $ 1 irá reter file1.txt como valor que não é igual a .txt .

O que você deve fazer é obter a extensão do arquivo primeiro de $ 1 e depois verificá-lo com o tipo (sem ponto)

v1="$1"
v2="$2"
ext1=${v1##*.}
ext2=${v2##*.}
if [ "$ext1" != "txt" ] || [ "$ext2" != "dat" ] || [ ! -e "$1" ]; then
echo "The file is ending"
exit
fi
echo "Starting rest of code"
    
por H. Freeze 24.09.2015 / 02:00
0

Tente aproveitar o comando basename .

#!/bin/sh

if [ "$(basename $1 .txt)" = "$1" -o "$(basename $2 .dat)" = "$2" ]; then
    echo "the file is ending" >&2
    exit 1
fi

echo "starting rest of code"

Esse trecho de código tenta remover uma determinada extensão e comparar a versão removida com a original: se ela não tiver sido alterada, o nome do arquivo não terá a extensão especificada. Observe a lógica invertida (se as strings forem iguais, o nome do arquivo não terá a extensão especificada).

Esta solução funciona com o shell padrão ou com o bash.

    
por Stephen M. Webb 24.09.2015 / 05:25
0

Você pode usar o operador =~ para correspondência de expressão regular:

#!/bin/bash
v1="$1"
v2="$2"
pat1='.*\.txt$'
pat2='.*\.dat$'
if [[ ! ($v1 =~ $pat1 && $v2 =~ $pat2 && -e $v1) ]]; then
    echo Ending program
    exit
fi
echo Continuing program
    
por CrazyApe84 24.09.2015 / 01:58