쉘 환경 변수의 항목 순서 확인

쉘 환경 변수의 항목 순서 확인

환경 변수에서 특정 디렉터리가 항상 다른 디렉터리 뒤에 나타나는지 확인하고 싶습니다.

목록 항목은 PATH 변수와 마찬가지로 콜론으로 구분됩니다.

이것은 bash에만 적용되는 것이 아니라 몇 가지 다른 쉘에도 적용됩니다.

문제는 표준 유닉스 유틸리티를 사용하여 목록의 항목 순서를 확인하는 방법을 잘 모르겠다는 것입니다.

출발점은 무엇입니까?

편집하다:

예는 다음과 같습니다

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

예를 들어, test라는 단어가 포함된 디렉터리 경로가 목록에서 test라는 단어가 포함되지 않은 디렉터리보다 앞에 있는지 테스트하고 싶습니다.

내가 하고 싶은 일은 디렉터리를 하드코딩할 수 있을 만큼 작아서 동적 솔루션이 필요하지 않습니다.

답변1

POSIX적으로:

$ 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

구체적인 예를 들면 다음과 같습니다.

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"

관련 정보