whileループエラー

whileループエラー

私はUnixシェルスクリプトを使って整数配列をソートするプログラムを書いた。ただし、11行目でエラーが発生します。

while [ $d -gt 0 && ${a[$(d-1)]} -gt ${a[$d]} ]

エラーはinsertionsort.sh: line 11: [: missing] ''と同じです。私は何が間違っていましたか?

答え1

コマンドを分割する必要がありますtest(またはPOSIX互換シェルを使用している場合は、拡張子を引用する必要があります)。

[ "$d" -gt 0 ] && [ "${a[d-1]}" -gt "${a[d]}" ]

答え2

これはksh構文(bashおよびサポートされています)であり、これらの配列のインデックス付けは(他のすべてのシェルのように1の代わりに)0から始まるため、ここで算術評価演算子を使用することもzsh -o ksharraysできます。ksh ((...))

while ((d > 0 && a[d-1] > a[d]))

(他の人はすでにあなたのコードで問題を説明しています。)

zshには、10進整数配列を数字でソートする機能が組み込まれています。

$ a=(10 6 2)
$ echo ${(n)a}
2 6 10

kshは配列をソートできますが、語彙順でのみソートできます。

$ a=(10 2 6)
$ set -sA b -- "${a[@]}"
$ echo "${b[@]}"
10 2 6

答え3

コードには2つのエラーがあります。

  1. テストに使用されている場合は、[ ... ]複数のテストを分離し、[ ... ]その間に論理演算子を使用してください。

    while [ expression ] && [ expression ]; do
    

    bashこれを使用している場合は、次のようにテストをビルドできます[[ ... ]]

    while [[ expression && expression ]]; do
    

    ...しかし、分割するとより読みやすくなります。

    while [[ expression ]] && [[ expression ]]; do
    

    少なくともより長いまたはより多くの表現が必要です。算術専用テストでは、(( ... ))inbashとそれをサポートする他のシェルを使用できます。たとえば、(( arithmetic expression )) && (( arithmetic expression ))Inではetcの代わりにetcを(( ... ))使用する必要があります。<>-lt-gt

  2. 配列を使用すると仮定すると、配列bashのインデックスは算術コンテキストで計算されます。これは${a[$d]}、次のように書くことができることを意味します${a[d]}。さらに重要なのは、${a[$(d-1)]}このコマンドがというコマンドを実行しようとするためにバグになる可能性があることですd-1。おそらくそうする必要があります${a[d - 1]}

関連情報