Verificando a ordem dos itens em uma variável de ambiente do shell

2

Eu estou querendo verificar se certos diretórios sempre aparecem depois de outros diretórios em uma variável de ambiente.

Os itens da lista são separados por dois pontos, como na variável PATH.

Isto não é simplesmente para bash, mas para alguns shells diferentes.

O problema é que não sei como verificar a ordem dos itens em uma lista usando utilitários unix padrão.

O que seria um ponto de partida?

editar:

Um exemplo seria

$LIST=/test:/bin/test:/etc/test:/nan/:/var

Eu gostaria de testar, por exemplo, que qualquer caminho de diretório que tivesse a palavra test nele fosse anterior na lista para um diretório que não o fez.

O que eu quero fazer é pequeno o suficiente para que eu possa codificar os diretórios, então uma solução dinâmica não é necessária.

    
por Sonny Ordell 11.10.2013 / 12:05

1 resposta

7

POSIXly:

$ awk 'BEGIN{
  n = split(ENVIRON["PATH"], p, ":")
  while (n) i[p[n]]=n--
  if (! (ARGV[1] in i))
    print ARGV[1], "is not in $PATH"
  else if (! (ARGV[2] in i))
    print ARGV[2], "is not in $PATH"
  else if (i[ARGV[1]] < i[ARGV[2]])
    print ARGV[1], "is before", ARGV[2]
  else
    print ARGV[1], "is after", ARGV[2]
  exit}' /bin /usr/bin
/bin is after /usr/bin

Para o seu exemplo específico:

check_order() (
  test_seen=false non_test_seen=false
  IFS=:; set -f
  for i in $1; do
    case $i in
      (*test*)
        if $non_test_seen; then
          echo "there are some non-tests before some tests"
          return
        fi
        test_seen=true;;
      (*)
        non_test_seen=true
    esac
  done
  if $test_seen; then
    echo "tests are all first"
  else
    echo "no tests in there"
  fi
)
check_order "$LIST"
    
por 11.10.2013 / 12:22