【问题标题】:ls conditional in a linux script for loopls 条件在 linux 脚本中 for 循环
【发布时间】:2012-01-11 18:51:19
【问题描述】:

我正在尝试创建一个简单的for 循环,它将获取ls 命令的所有输出并将每个输出放入一个变量中。到目前为止我有

for i in ls /home/svn
do
    echo $i
done

但它给了我一个错误。

【问题讨论】:

标签: linux sh ls


【解决方案1】:

因为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##*/}

解释替换:##从字符串中删除最长的前锚定模式,#直到第一个模式匹配,%%最长的后锚定模式和%第一个后锚定完全匹配。

【讨论】:

    【解决方案2】:

    您想将 ls 命令的输出分配给 i,因此您需要将其括在反引号或 $() 运算符中:

    for i in $(ls /home/svn)
    do
        echo $i
    done
    

    【讨论】:

      【解决方案3】:

      在这种情况下,您不需要使用ls 来检查文件,下面的就可以了:for i in /home/svn/*; do echo $i; done

      【讨论】:

      • 效果不错!我想最后一个问题是使用 basename 基本上我正在尝试使用 basename $i 来获取该目录末尾的名称,但是当我执行 echo basename $i 时它总是打印出 basename $i
      • @GwFiles: basename 是命令,echo 也是。所以不要两者都做,直接说for i in /home/svn/*; do basename $i; done
      【解决方案4】:

      那是因为你一开始就做错了。

      for i in /home/svn/*
      do
        echo "$i"
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-24
        • 2011-08-03
        • 2013-12-13
        • 2023-04-06
        • 2023-03-18
        • 2015-06-06
        • 2017-12-05
        • 2022-05-17
        相关资源
        最近更新 更多