私のファイルの内容:
123
**1
**
各単語を表示するスクリプトを試してください。
for i in $(cat $myfile)
do
echo "$i"
done
その結果、echo *
現在のディレクトリにあるファイルが一覧表示されますが、その理由はわかりません。それで、*
以前のエコーを処理してみました。
他のスクリプトの内容:
for i in $(cat $myfile)
do
if [[ $i == *\+ ]](regex pattern find 1 * or more.)
then
(?what should I do. I tried i="\*",i="*" etc.; it doesn't work)
fi
echo "$i"
done
答え1
ファイル名のグロービングは、ではなくfor
拡張される-lineで発生します。$(cat $myfile)
echo
ファイルの内容を繰り返すときは、以下を使用してくださいread
。
while IFS= read -r words; do
printf '%s\n' "$words"
done <"$myfile"
また見なさい:
- 「IFS=read-r-line」を理解する
- シェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?
- bash / POSIXシェルで変数を引用することを忘れてしまうセキュリティリスク
スペースで区切られた各単語を独自の出力行に表示するには、次の手順を実行します。
awk '{ for (i = 1; i <= NF; ++i) print $i }' "$myfile"
答え2
正解は、テキストを処理するためにシェルループを使用しないでください。しかし、迅速な解決を望むなら、
set -o noglob
for i in $(cat $myfile)
do
echo "$i"
done
set +o noglob
このnoglob
オプションはパス名の拡張を防ぎ、ファイルリストの代わりにecho *
ファイルリストを話してインポートすることができます。*
答え3
実際には2つの質問がありますが、どちらもシェルがどのように役割を処理するかに関するものです*
。この文字はシェルで特別な意味を持ち、あなたが見つけたようにシェルのマニュアルページから呼び出される特別な形式の正規表現として機能します。全体的な状況ファイル名について。これが現在のディレクトリからファイル名のリストを取得する理由です。リストは次のとおりです。この特定の型の正規表現構文のすべての形式の詳細な説明については、シェルのマニュアルページの globbing セクションを参照してください。
質問の2番目の部分は、これが起こらないようにする方法を尋ねるようです。 2つの方法があります。誰でも脱出するバックスラッシュが先頭に\
あるか、単一引用符で囲まれた文字。'*'
。