web-dev-qa-db-ja.com

zshの単一の括弧内の文字列比較

すべてのフォルダーを印刷する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標準はありますか?

11
user93868

ここにはさまざまな問題があります。最初、 ==は標準ではありません。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" ~/*
18
terdon

試してください:

if [ "$f" = '/home/sk/.' ] || [ "$f" = '/home/sk/..' ]
2
Janis

質問への直接の回答ではありませんが、POSIX仕様では*.または..に展開されないため、条件は不要です。

また、すべてのフォルダを印刷したいので、パターンの末尾に/を指定する必要があります

したがって、非表示ではないディレクトリをすべて印刷するには、このようなもので十分です。

for d in ~/*/
do
  [ -d "$f" ] && printf "%s\n" "${d%/}"
done

ディレクトリエントリのテストに注意してください。テストがない場合、ディレクトリがない場合、パターンが出力されます。 ${d%/}は、パターンによって引き起こされた末尾の/を削除するために使用されます。

0
Scrutinizer