11

我有一个简单的 bash 脚本 simple.sh,如下:

#/usr/local/bin/bash
for i in $1
   do
       echo The current file is $i
   done

当我使用以下参数运行它时:

./simple.sh /home/test/*

它只会打印并列出目录中的第一个文件。

但是,如果我将 simple.sh 更改为:

#/usr/local/bin/bash
DIR=/home/test/*
for i in $DIR
   do
       echo The current file is $i
   done

它会正确打印出目录中的文件。有人可以帮助解释为什么传递的参数没有显示相同的结果吗?

4

4 回答 4

12

如果你取“$1”,它是第一个文件/目录,这是可能的!你应该这样做:

for i in "$@"
do
  echo The current file is ${i}
done

如果你执行它:

./simple.sh *

他们列出了实际字典的所有文件

"$1" 是当前目录的第一个文件/目录的字母顺序,在 for 循环中,"i" 的值将是例如 a1.sh,然后它们将退出 for 循环!如果你这样做:

DIR=/home/<s.th.>/* 

您将所有文件/目录的值保存在 DIR 中!

于 2013-04-02T11:37:36.217 回答
2

这是可移植的,没有无用的 ls 分支,并且以最少的 CPU 周期浪费运行:

#!/bin/sh
cd $1
for i in *; do
   echo The current file is "$i"
done

运行方式./simple.sh /home/test

于 2013-04-02T11:50:56.697 回答
1

您的脚本没有收到“/home/test/*”作为参数;shell 将模式扩展为匹配的文件列表,并且您的 shell 接收多个参数,每个匹配文件一个。引用论点将起作用:

./simple.sh "/home/test/*"

您对 using 的更改DIR=/home/test/*符合您的预期,因为文件名生成不是在变量赋值的 RHS 上执行的。当您$DIR在循环中不加引号时for,模式被扩展为匹配文件的列表。

于 2013-04-02T12:39:03.687 回答
-2

如何手动列出文件而不是使用 *:

  #/usr/local/bin/bash
  for i in $(ls $1)
  do
      echo The current file is $i
  done

并输入

 ./simple.sh /home/test/
于 2013-04-02T11:39:23.310 回答