为什么可以';我是否将目录作为参数传递给bash中的for循环?
我有一个简单的bash脚本simple.sh,如下所示:为什么可以';我是否将目录作为参数传递给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
#/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;-)不;当考虑到编译的碳足迹,呃,循环足迹时就不是了:-)