環境変数で、特定のディレクトリが常に別のディレクトリの後に表示されることを確認したいと思います。
リスト項目は、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"