私はオペレーティングシステムプロセス用のシェルスクリプトを書こうとしています。しかし、ファイルの内容を読むことはできません。質問に対する回答として、私が入力した内容だけを読んだようです。私が何を見逃しているのかよくわかりません(とても簡単です)。よろしくお願いします。
echo "what file do you want to count? "
read file
mystring=$file
for token in $mystring;
do
echo -n "lines: ";
echo -n $token | wc -l;
echo -n "words: ";
echo -n $token | wc -w;
echo -n "chars: ";
echo -n $token | wc -c;
done
答え1
作成するスクリプトは、ファイル名に対応するファイルの行数などではなく、ユーザーが入力した文字列の行数などを計算します。
以下は、目的の操作を実行し、ファイルが存在しない場合や通常のファイルでない場合にエラーメッセージを表示するスクリプトです。
#!/bin/sh
echo "Enter filename"
read fname
if [ ! -f "$fname" ]; then
echo "No such file!" >&2
exit 1
fi
lines=$( wc -l <"$fname" )
words=$( wc -w <"$fname" )
chars=$( wc -c <"$fname" )
printf 'The file "%s" has %d lines, %d words and %d characters\n' \
"$fname" "$lines" "$words" "$chars"
wc
3回呼び出すのを防ぐには:
#!/bin/sh
echo "Enter filename"
read fname
if [ ! -f "$fname" ]; then
echo "No such file!" >&2
exit 1
fi
printf 'The file "%s" has %d lines, %d words and %d characters\n' \
"$fname" $( wc <"$fname" )
これは、デフォルトの出力が行、単語、および文字数であるという事実を利用しますwc
。このように出力したい場合はそれで十分です。
答え2
このコードはファイルの内容を読みません。スクリプトで実行する作業は、ユーザーからファイル名を取得し、それを変数($file
およびそれ以降$mystring
)に保存することです。
を実行すると、for token in $mystring
変数の内容がリストとして表示されますが、$mystring
ユーザーが入力したファイル名のみが表示されます。したがって、参照されたすべてのコマンドは、$token
ユーザーから取得した文字列に基づいて機能します。
ファイルの内容を操作するには、cat
@faadi:指摘したとおりに使用できますmystring=$(cat $file)
。
編集する:
答えで何かを修正するだけです。私の懸念は、あなたが文書を読むことができず、@steeldriverが彼のコメントで提起した別の問題を解決しなかったことです。行をからに変更すると、mystring=$file
最終的にmystring=$(cat $file)
ファイルの内容をリストに分割してwc
その内容を実行するので、目的の効果が得られません。
forループを削除してこれを使用できます(テキストを変数に保存して使用したい場合echo
)。
#!/bin/bash
echo "File to read:"
read file
mystring=$(cat $file)
echo ""
echo "TEXT:"
echo "$mystring"
echo ""
echo -n "Lines: "
echo "$mystring" | wc -l
echo -n "Words: "
echo "$mystring" | wc -w
echo -n "Chars: "
echo "$mystring" | wc -c
または、@steeldriverが提案したように、wc
次のようにファイルをSTDINにリダイレクトします。
#!/bin/bash
echo "File to read:"
read file
echo ""
echo "TEXT:"
cat $file
echo ""
echo -n "Lines: "
wc -l < $file
echo -n "Words: "
wc -w < $file
echo -n "Chars: "
wc -c < $file