シェル環境変数の項目順序の確認

シェル環境変数の項目順序の確認

環境変数で、特定のディレクトリが常に別のディレクトリの後に表示されることを確認したいと思います。

リスト項目は、PATH変数と同様にコロンで区切られます。

これはbashにのみ適用されるのではなく、他のいくつかのシェルにも当てはまります。

問題は、標準のUnixユーティリティを使用してリスト内の項目の順序を確認する方法がわからないことです。

出発点は何ですか?

編集する:

例は次のとおりです。

$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"

おすすめ記事