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