- 引数が入力として提供される場合、スクリプトはその入力ファイルの行数のみを確認する必要があります。そうでない場合、スクリプトはそのディレクトリ内の各ファイルの行数を表示する必要があります。
- スクリプトファイルは無視する必要があります。つまり、スクリプトファイルの数を表示しないでください。
私は試した:
#!/bin/bash
if [ $# -eq 0 ]
then
for l in *.txt
do
echo $(wc -l $l)
done
else
for l in $*
do
echo $(wc -l $l)
done
fi
ただし、ファイル形式(例:* .txt)を明示的に言及することは許可されていません。スクリプトファイルを除くすべてのファイルを確認する必要があります。
答え1
ほとんど理解していると思います。あなたはbasename "$0"
それを使用することができますスクリプト内のスクリプト名の検索を除くすべての項目の行数を印刷します。
#!/bin/bash
if [ $# -eq 0 ]
then
for k in *
do
if [[ ! -d "$k" && "$k" != `basename "$0"` ]]
then
wc -l "$k"
fi
done
else
for k in $*
do
wc -l "$k"
done
fi
私は自由を取る
k
代わりに使用してくださいl
(変数名にはお勧めできません。リンクが見つかりませんがわかります(、1
と混同される可能性がありますI
))。- インデントには8つのスペースではなく4つのスペースを使用します。もちろん、最終決定はあなたの分け前ですが、8つより4つのスペースがより読みやすいと言いたいです。
- 変数を参照してください。変数名をスペースで区切らないことをお勧めします。
echo
@Sergが指摘したように、不要なコンテンツを削除します。
編集するif
条件だけでなく、それを無視するために二重括弧とディレクトリテストを追加しました。
答え2
#!/bin/bash
if [[ "$#" != 0 ]]; then
# only process the names given to us
wc -l "$@"
exit
fi
# process all regular files in this directory, avoiding this script
for f in ./*; do
if [[ "$f" != "$0" ]] && [[ -f "$f" ]]; then
wc -l "$f"
fi
done
答え3
スクリプトに加えて、3つのコマンドを1行にまとめて目的の結果を印刷できます。
例えば。
find . -maxdepth 1 -type f -name "*.txt" -exec cat {} + | wc -l
現在のディレクトリでのみ検索せずに行数を再帰的に計算したい場合は、「-maxlength 1」スイッチを削除するか、必要に応じて数値を変更できます。