Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我是否将目录作为参数传递给bash中的for循环?_Bash_Directory - Fatal编程技术网

为什么可以';我是否将目录作为参数传递给bash中的for循环?

为什么可以';我是否将目录作为参数传递给bash中的for循环?,bash,directory,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

我有一个简单的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
它将正确打印出目录中的文件。有人能解释为什么传递的参数没有显示相同的结果吗?

如果使用“$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=/home/*

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

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

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

 ./simple.sh /home/test/

这是一款可移植的产品,没有无用的ls分叉,运行时浪费的CPU周期最少:

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

/simple.sh/home/test

的形式运行脚本,但脚本未收到“/home/test/*”作为参数;shell将模式扩展为匹配的文件列表,shell将接收多个参数,每个匹配的文件一个参数。引用该论点将起作用:

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

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

这应该是
“$@”
,因此它甚至适用于名称中带有空格的文件。对于
“$i”
而言,消息中也会保留空白。这都是关于细节的:-)解释的最后一部分有点不正确;模式扩展不会发生在参数指定的右侧。展开
$DIR
时,如果该模式不是引号,则该模式也会展开(如原始问题中所示)。使用
echo“$DIR”
进行验证。如果目录中的任何文件名包含空格,则此操作将无效。“浪费的CPU周期的最小值”可能是C,而不是bash,tbh;-)不;当考虑到编译的碳足迹,呃,循环足迹时就不是了:-)