为什么“ $Namefile* ”给我这样的结果?

为什么“ $Namefile* ”给我这样的结果?

在我的代码中,有这样的部分;

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”)。如果要匹配提供给脚本的所有参数,请使用内部变量$*。在您的脚本中,您将$1wh1(位置参数编号 1)保存到变量 Namefile 中。所以在后面使用 *$Namefile与 . 具有不同的含义$*。欲了解更多信息,请参阅此处内部变量(位置参数部分)

答案3

这只是因为 的-l选项ls。在这种情况下,because$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

相关内容