履歴の最後の10行を削除するbashスクリプトを作成したいのですが、まだエラーが発生します
#!/bin/bash
i= history | wc -1
j= $i-10
for x in {$i..$j}
do
history -d $x
done
何が問題なのか分かりません。何か考えはありますか?
答え1
いくつかのエラーがあります。
i= 履歴 | wc -1
ここにはスペースがあるので、エラーを避けるためにこれを "" で囲む必要があります。さらに、等号の後に不要なスペースを追加しています。ただし、実行したのは "history | wc -1" を含む変数を作成しただけです。まず、"wc -1" はありません。行数をカウントする "wc -l" を意味していたと思います。次に、このコマンドを実際に実行したかったと思います。
次のようなものが使えます:
i=$(履歴 | wc -l)
ただし、サブシェル内にいるため、結果は常に 0 になります。
j= $i-10
等号の後にスペースを追加しました。「j=$i-10」を使用することもできますが、実際には計算は行われません。
次のようなことを試してください:
j=$(エコー "${i}-10" | bc -l)
おそらく、i が 10 以下のシナリオを処理するために if ステートメントを記述することになるでしょう。
次のようなことを試してください:
if [[ "$i" -lt "11" ]]; then j="1"; fi
{$i..$j}内のxについて
ここでは変数は使用できません。結果は数値のリストではなく #..# になります。この問題を回避するには、変数にエコーされる 1 行の for do done ステートメントを作成し、eval を使用して実際に実行します。この方法では、コマンドの実行時に $i と $j が実際の数値に置き換えられます。
最終的にけれど、このアプローチ全体は無意味だシェル スクリプトで history コマンドを実行すると、サブシェル内では履歴を報告しないため、カウントの結果として 0 が返されます。意味を理解するには、いくつかのコマンドを実行してから、次のスクリプトを実行します。
#!/bin/bash 履歴 | wc -l
ご覧のとおり、結果は 0 です。なぜでしょうか? これはサブシェルの履歴であり、サブシェルは履歴を報告しないからです。履歴コマンドの前にスクリプトに他のコマンドを追加しても、結果は 0 になります。
最初からやり直してください。履歴ファイルを直接編集することを検討してください@kos が示唆したとおりです。現在のシェルからのコマンドは、シェルが終了するまでファイルに書き込まれないことに注意してください。
幸運を。