スクリプトは変数値= *をエコーできません。

スクリプトは変数値= *をエコーできません。

私のファイルの内容:

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"

また見なさい:


スペースで区切られた各単語を独自の出力行に表示するには、次の手順を実行します。

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つの方法があります。誰でも脱出するバックスラッシュが先頭に\あるか、単一引用符で囲まれた文字。'*'

関連情報