Por que “$ i | sed ”não funciona?

2

Eu tenho este código:

if [ $i | sed -e "s/^.*\(.\)$//" = "/" ]
then
    echo "folder"
else
    echo "file"
fi

onde $i é algo assim

app4/

O código acima deve pegar o último caractere da string e verificar se é uma barra ( / ), mas isso me diz:

./str: line 12: =app4/: File or directory doesn't exist

Como posso resolver isso?

    
por Matteo Pagliazzi 21.12.2011 / 19:09

2 respostas

2

Você pode substituir o valor de $i in para ver o comando exato que está tentando executar:

app4/ | sed -e "s/^.*\(.\)$//"

Isso não funciona porque app4/ não é um comando. Você está tentando canalizar app4/ para sed , então você precisa usar algo que produza app4/ :

echo app4/ | sed -e "s/^.*\(.\)$//"

Isso funciona, mas você não precisa usar sed para isso; bash tem algumas ferramentas de manipulação de strings. Por exemplo, ${i#} fornecerá o comprimento de $i e ${i:j} fornecerá uma substring a partir de j , por isso ${i:$((${i#}-1))} fornecerá o último caractere.

A maneira mais fácil de fazer o que você está tentando é provavelmente com ${i%/} . Isso retornará $i , mas removerá um / do final, se houver um:

$ i="app4"; echo ${i%/}
app4
$ i="app4/"; echo ${i%/}
app4

Assim:

if [ "${i%/}" = "$i" ]
then
    echo "file"
else
    echo "folder"
fi

No entanto, se tudo que você realmente quer é saber se $i é um diretório válido, você pode simplesmente usar:

if [ -d "$i" ]
    
por 21.12.2011 / 19:20
1

A maneira mais fácil de verificar se a variável termina em / é:

[[ $i = */ ]]

.. embora, como Johan disse, você pode apenas verificar se existe e criá-lo se não for. Isso deve ser citado corretamente:

if [[ ! -d $i ]]; then
    mkdir -p "$i" || exit 1
fi

Não precisamos citar expansões dentro do [[..]] que, junto com sua maior utilidade e velocidade, o tornam muito mais agradável de usar; nós definitivamente precisamos citar o parâmetro para mkdir.

    
por 10.01.2012 / 10:51