Comparação de strings entre colchetes em zsh [duplicate]

5

Código bash para imprimir todas as pastas:

for f in ~/*;
do
if [ $f  == '/home/sk/.' -o $f  == '/home/sk/..' ]; then
       true
  else
     echo "$f"
  fi
done

Funciona no bash. Quando eu corri o código no shell z, ele jogou erro:

 = not found

Em seguida, converti [ em [[ , ] em ]] para evitar esse erro no z shell e o executei no z shell. Ele jogou o próximo erro:

condition expected: $f

Com [[ e ]] , o bash também gera erro como:

syntax error in conditional expression
syntax error near '-o'

Existe um padrão POSIX para fazer uma comparação de string no shell, que funciona através de shells?

    
por Madhavan Kumar 07.06.2015 / 16:23

3 respostas

10

Existem vários problemas aqui. Primeiro, == não é padrão, a maneira POSIX é = . O mesmo vale para o -o . Este vai funcionar tanto no bash quanto no zsh:

for f in ~/*;
do
if [ "$f"  = '/home/sk/.' ] || [ "$f"  = '/home/sk/..' ]; then
       true
  else
     echo "$f"
  fi
done

Note que seu if é desnecessário, os arquivos de ponto são ignorados por padrão no bash e no zsh. Você pode simplesmente escrever:

for f in ~/*; do echo "$f"; done

Ou até mesmo

printf "%s\n" ~/*
    
por 07.06.2015 / 16:34
3

Tente:

if [ "$f" = '/home/sk/.' ] || [ "$f" = '/home/sk/..' ]
    
por 07.06.2015 / 16:32
1

Não é uma resposta direta à sua pergunta, mas as condições são desnecessárias, pois na especificação POSIX * não será expandida para . ou ..

Além disso, você mencionou que deseja imprimir todas as pastas, então você precisaria especificar um / no padrão

Então, algo assim deve ser suficiente para imprimir todos os diretórios não ocultos.

for d in ~/*/
do
  [ -d "$f" ] && printf "%s\n" "${d%/}"
done

Observe o teste de uma entrada de diretório, caso contrário, o padrão será impresso se não houver diretórios. ${d%/} é usado para remover o / final induzido pelo padrão.

    
por 07.06.2015 / 16:59

Tags