【发布时间】:2012-01-11 18:51:19
【问题描述】:
我正在尝试创建一个简单的for 循环,它将获取ls 命令的所有输出并将每个输出放入一个变量中。到目前为止我有
for i in ls /home/svn
do
echo $i
done
但它给了我一个错误。
【问题讨论】:
我正在尝试创建一个简单的for 循环,它将获取ls 命令的所有输出并将每个输出放入一个变量中。到目前为止我有
for i in ls /home/svn
do
echo $i
done
但它给了我一个错误。
【问题讨论】:
因为ls需要被执行:
for i in $(ls ...); do
echo $i
done
另外,您可能需要考虑使用 shell 通配符:
for i in /home/svn/*; do
echo $i
done
...或find,它允许非常细粒度地选择要查找的项目的属性:
for i in $(find /home/svn -type f); do
echo $i
done
此外,如果您可以在路径段或文件名本身中包含空格,请使用 while 循环(调整之前的示例):
find /home/svn -type f|while read i; do
echo $i
done
while 逐行读取,因此保留了空白。
关于basename 的调用,您有两种选择:
# Call basename
echo $(basename $i)
# ... or use string substitution
echo ${i##*/}
解释替换:##从字符串中删除最长的前锚定模式,#直到第一个模式匹配,%%最长的后锚定模式和%第一个后锚定完全匹配。
【讨论】:
您想将 ls 命令的输出分配给 i,因此您需要将其括在反引号或 $() 运算符中:
for i in $(ls /home/svn)
do
echo $i
done
【讨论】:
在这种情况下,您不需要使用ls 来检查文件,下面的就可以了:for i in /home/svn/*; do echo $i; done
【讨论】:
basename 是命令,echo 也是。所以不要两者都做,直接说for i in /home/svn/*; do basename $i; done。
那是因为你一开始就做错了。
for i in /home/svn/*
do
echo "$i"
done
【讨论】: