すべてのフォルダーを印刷するBashコード:
for f in ~/*;
do
if [ $f == '/home/sk/.' -o $f == '/home/sk/..' ]; then
true
else
echo "$f"
fi
done
Bashで動作します。 z Shellでコードを実行すると、エラーが発生しました。
= not found
次に、[
から[[
、]
から]]
zシェルでこのエラーを回避し、zシェルで実行しました。次のエラーが発生しました:
condition expected: $f
[[
および]]
、bashも次のようなエラーをスローします。
syntax error in conditional expression
syntax error near `-o'
シェル全体で機能する、シェルで文字列比較を行うPOSIX標準はありますか?
ここにはさまざまな問題があります。最初、 ==
は標準ではありません。POSIXの方法は=
。同じことが-o
。これはbashとzshの両方で機能します。
for f in ~/*;
do
if [ "$f" = '/home/sk/.' ] || [ "$f" = '/home/sk/..' ]; then
true
else
echo "$f"
fi
done
if
は不要であることに注意してください。bashとzshの両方で、ドットファイルはデフォルトで無視されます。あなたは単に書くことができます:
for f in ~/*; do echo "$f"; done
あるいは
printf "%s\n" ~/*
試してください:
if [ "$f" = '/home/sk/.' ] || [ "$f" = '/home/sk/..' ]
質問への直接の回答ではありませんが、POSIX仕様では*
が.
または..
に展開されないため、条件は不要です。
また、すべてのフォルダを印刷したいので、パターンの末尾に/
を指定する必要があります
したがって、非表示ではないディレクトリをすべて印刷するには、このようなもので十分です。
for d in ~/*/
do
[ -d "$f" ] && printf "%s\n" "${d%/}"
done
ディレクトリエントリのテストに注意してください。テストがない場合、ディレクトリがない場合、パターンが出力されます。 ${d%/}
は、パターンによって引き起こされた末尾の/
を削除するために使用されます。