
私のコードにはこのような部分があります。
Namefile=$1
for n in $Namefile*
do
echo $n
done
この部分の結果は次のとおりです。
$ sh example.sh hw1
hw1_evening_sun.txt
hw1_morning_sun.txt
hw1_out_si_wire.txt
hw1_script.sh
hw1_script2.sh
hw1_script3.sh
hw1_sun1.txt
hw1_sun2.txt
"hw1"という名前で始まるファイルがありますが理解できません。$Namefile* がこれらの名前を使用する理由私が知っている限り、*呼び出しスクリプトはパラメータを受け取ります。
この方法はなぜこのように動作するのでしょうか?誰かがこれの論理を説明できますか?
答え1
$ Namefile *がなぜこれらの名前を使用するのかわかりません。私が知っている限り、*呼び出しスクリプトはパラメータを受け取ります。
$ Namefileは渡された値(おそらく「hw」)に展開されます。これは、$ Namefile *変数が拡張後に「hw *」になることを意味します。
*は、この文字列がファイル名として解釈されるために使用されるときに特別です。マニュアルページの「パス名の拡張」を参照してください。
... bashは各単語で*、?と[文字を検索します。これらの文字のいずれかが発生すると、その単語はパターンとして扱われ、パターンと一致するファイル名のアルファベット順のリストに置き換えられます。
答え2
ここではforループで置換を行っています。したがって、starは$Namefile
文字列の後のすべての文字と一致します( "hw1"のようです)。スクリプトに指定されたすべての引数を一致させるには、内部変数を使用します$*
。スクリプトは、$1
wh1(位置パラメータ番号1)を変数Namefileに保存します。したがって、*と.を後で使用することは$Namefile
異なる意味を持ちます$*
。詳しくはこちらをご覧ください内部変数(位置パラメータセクション)
答え3
-l
これは単なるオプションによるものですls
。この場合、次の$Namefile*
ように拡張されますhw1_evening_sun.txt ..snip.. hw1_sun2.txt
。
ls -l $Namefile*
実際には
ls -l hw1_evening_sun.txt ..snip.. hw1_sun2.txt
詳細については、以下を実行してくださいman ls
。
...
-l use a long listing format
...
* nixへようこそ。
答え4
これは、doループが次のようになるためです。-l
期待に応える結果を得るには、次のことを行う必要があります。その部分バックティック内のスクリプトは次のとおりです。
TMPファイル
Namefile=$1
for n in $Namefile*
do
echo $n
done
特定の部分を実行するには、
ls -l `./tmp.sh "d"`
-bash-3.2$ ls -l `./again d`
-rw-r--r-- 1 me me 0 Jun 3 05:16 dat
-rw-r--r-- 1 me me 0 Jun 3 05:16 dis