我正在尝试创建一个简单的for
循环,它将获取ls
命令的所有输出并将每个输出放入变量中。到目前为止我有
for i in ls /home/svn
do
echo $i
done
但它给了我一个错误。
答案 0 :(得分:5)
因为需要执行ls
:
for i in $(ls ...); do
echo $i
done
另外,您可能需要考虑使用shell globbing:
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##*/}
解释替换:##
从字符串中删除最长的前锚定模式,#
直到第一个模式匹配,%%
最长的后锚模式和{{ 1}}第一次回归完全匹配。
答案 1 :(得分:1)
在这种情况下,您无需使用ls
来检索文件,以下内容可以完成此任务:for i in /home/svn/*; do echo $i; done
答案 2 :(得分:0)
您希望将ls命令的输出分配给i,因此您需要将其括在反引号或$()运算符中:
for i in $(ls /home/svn)
do
echo $i
done
答案 3 :(得分:0)
那是因为你首先做错了。
for i in /home/svn/*
do
echo "$i"
done