zshの単一の角かっこ内の文字列の比較

zshの単一の角かっこ内の文字列の比較

すべてのフォルダを印刷するBashコード:

for f in ~/*;
do
if [ $f  == '/home/sk/.' -o $f  == '/home/sk/..' ]; then
       true
  else
     echo "$f"
  fi
done

それはbashで動作します。 z シェルでコードを実行するとエラーが発生します。

 = not found

その後、zシェルでこのエラーを回避するために、[に変換してzシェルで実行しました。次のエラーが発生します。[[]]]

condition expected: $f

[[andを使用すると、]]bashもエラーを発生させます。

syntax error in conditional expression
syntax error near `-o'

シェル全体で動作するシェルの文字列比較のためのPOSIX標準はありますか?

答え1

これにはあらゆる種類の問題があります。まず、==標準ではありません。 POSIX方式は=同様に適用されます-o。これはbashとzshでも動作します。

for f in ~/*;
do
if [ "$f"  = '/home/sk/.' ] || [ "$f"  = '/home/sk/..' ]; then
       true
  else
     echo "$f"
  fi
done

ifbashとzshの両方では、デフォルトではドットファイルは無視されます。簡単に次のように書くことができます。

for f in ~/*; do echo "$f"; done

でも

printf "%s\n" ~/*

答え2

努力する:

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

答え3

あなたの質問に対する直接的な答えではありませんが、条件はPOSIX仕様で*拡張されていないため、不要です。...

また、すべてのフォルダを印刷したいと言われたので、末尾の/フォルダを指定する必要があります。

したがって、このような内容は、隠されたディレクトリではなく、すべてのディレクトリを印刷するのに十分です。

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

ディレクトリエントリのテストを参照してください。それ以外の場合は、ディレクトリがない場合はパターンが印刷されます。パターンによる汚れを除去する${d%/}ために使用されます。/

関連情報