在我的代码中,有这样的部分;
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
。在这种情况下,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