为什么我不能将目录作为参数传递给bash中的for循环?

时间:2013-04-02 11:33:41

标签: bash directory

我有一个简单的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 个答案:

答案 0 :(得分:9)

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

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

如果您执行:

./simple.sh *

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

“$ 1”按字母顺序排列当前目录的第一个文件/目录,而在for循环中,“i”的值将是例如“i”。 a1.sh然后他们会走出for循环! 如果你这样做:

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

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

答案 1 :(得分:1)

这是便携式的,没有无用的分叉,并且浪费了最少的CPU周期:

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

./simple.sh /home/test

运行

答案 2 :(得分:1)

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

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

您对使用DIR=/home/test/*的更改达到了您的预期,因为文件名生成不会在变量赋值的RHS上执行。当您在$DIR循环中不加引号for时,该模式已扩展为匹配文件列表。

答案 3 :(得分:-2)

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

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

并输入

 ./simple.sh /home/test/