私はメガバイト単位の整数を受け入れるコードを書いています。私の意図は、私のコンピュータのユーザーを繰り返して、ホームディレクトリの使用量がそのメガバイトを超えるユーザーの名前を再エコーすることです。だから私の戦略は、数字を取得してキロバイトからメガバイトに変換し、自分のコンピュータ上のすべての人のホームディレクトリを繰り返してユーザー名を再エコーすることです。
だから私のコードは次のようになります。
#!/bin/bash
#https://unix.stackexchange.com/questions/199220/how-to-loop-over-users
size=$(($1 * 1000000))
getent passwd | while IFS=: read -r name password uid gid gecos home shell; do
du -sh $home | awk '{$1}'
if [ $i -ge size]
then
echo $name
fi
done
ループはユーザーを巡回し、孤立して実行されます。 awkの目的は、ディスク使用量の数だけをキャプチャすることです。これはすべてのディレクトリを巡回しているように見えますが、それを行う権限はありません。
du: cannot read directory '/etc/vpnc': Permission denied
du: cannot read directory '/etc/credstore': Permission denied
du: cannot read directory '/etc/ssl/private': Permission denied
また、これをディスク使用量の制限と比較しようとすると、次のようになります。
if [ $i -ge size]
awkがサイズを正しくキャプチャしていないため、この行が見つかりませんでした。それでは、入力をhome directまたはduのサイズとどのように比較しますか?
7: [: missing ]
ありがとう
答え1
うまくいかないことを見つけるためにスクリプトを書くのは一般的です。ここで欠けているのは基本的なトラブルシューティングです。問題はこれである:
- スクリプトの不明な部分が破損しています。
- スクリプトを修復しようとしましたが、破損した部分が見つかりませんでした。
必要な戦略は2段階プロセスです。
- エラーを再現するために必要な最も単純なコードスニペットを見つけます。
- エラーを解決するには、コードを修正してください。
最初のエラーメッセージを見てみましょう。
4: 20: not found
これは4:
4行を意味するので、その行を確認したいと思います。size=$($1 * 1000000)
ここでは構文を使用しているので、引数を使用して呼び出すために$1
コードを bash 関数に入れようとしています(したがって同じ$1
構文を使用します。
bash-3.2$ function test_code { size=$($1 * 1000000); }
bash-3.2$ test_code 20
bash: 20: command not found
十分に近いです(他のバージョンのbashを使用している可能性があります)。エラー再現これで試してみることができます。このコードを編集してください。ここでは少しの経験が役に立ちます。20:
これは、行番号として解釈される可能性があるためです。ただし、実際にはパラメータの値にすぎません。
bash-3.2$ test_code example
bash: example: command not found
date
ここでの問題は、次のように既存のコマンドに名前を付けるとさらに明らかになります。
bash-3.2$ test_code date
date: illegal time format
usage: date [-jnRu] [-I[date|hours|minutes|seconds]] [-f input_fmt]
[-r filename|seconds] [-v[+|-]val[y|m|w|d|H|M|S]]
[[[[mm]dd]HH]MM[[cc]yy][.SS] | new_date] [+output_fmt]
あなたのコードは引数を乗算しようとせず、1000000
引数をコマンド名として扱い、そのコマンドを実行しようとします。
- コードで2つの値を掛けて結果を保存しようとしています。
- 代わりに、コードは与えられた値をコマンドとして実行します。
したがって、Googleでは「bashに2つの値を掛ける」必要があります。 Googleは私に次のようなUnixとLinuxの質問をしました。Bashスクリプトの算術
私達は見た:
記号を使用してこれを行うことができます
$((expr))
。$ echo $((6 + 6)) 12 $ echo $((6 * 6)) 36
これを私たちのコードと比較すると、問題が明らかになります。
bash-3.2$ function test_code { echo $($1 * 1000000); }
bash-3.2$ test_code 20
bash: 20: command not found
つまり、括弧echo $($1 * 1000000)
は一対のみを()
使用し、サンプルecho $((6 * 6))
コードでは2対を使用します。このコードを修正できるかどうか見てみましょう。
bash-3.2$ function test_code { echo $(($1 * 1000000)); }
bash-3.2$ test_code 20
20000000
これで、スクリプトの4行目を更新でき、size=$(($1 * 1000000))
次のエラーに移動してプロセスを繰り返すことができます。