【问题标题】:Get Filename from Directory KSH Unix从目录 KSH Unix 中获取文件名
【发布时间】:2016-04-25 18:19:17
【问题描述】:

好的,我大约一周前问了一个问题,得到的答复有效但不能解决我的问题。我是 KSH 的新手。一个好的解释也会有所帮助我宁愿有一个起点或某个地方开始阅读,而不是已经写过代码。 :) 我希望成品看起来像这样:

iter = 1
do
   while fileExistsInDir==true
   $arr[$iter] = filename
    iter++
    done

 #do something with the array

在我之前的问题中,有人告诉我这样做

set --*
[#$var -gt 0]&&{
 echo $1 
}

这行得通,但我必须保持 1 美元的增量,即 2 美元、3 美元、4 美元等等。我希望它保持静态并更改每个文件的值。有没有更简单的方法来做到这一点。到目前为止,我在堆栈上看到的所有东西要么需要依赖,要么似乎不起作用。

【问题讨论】:

标签: shell unix ksh


【解决方案1】:

将当前目录下的所有文件放入一个数组非常简单:

$ arr=(*)
$ echo "${arr[@]}"

* 被称为 glob 构造,但大多数人称它为通配符。它的意思是“当前目录中的零个或多个字符的文件名”(即所有这些)。我假设是一个相对较新的 ksh 版本。多年来,Korn shell 中的数组处理发生了变化。

【讨论】:

  • 这比我现在使用的套装好吗?
  • 比较简单,简单就好。 en.wikipedia.org/wiki/KISS_principle 有些人在使用 set 时遇到问题 - 我没有。 set 有一些不为人知的问题,但在这些方法之间没有太多选择。
  • 当你使用没有数组的 shell 时,使用set 是必要的。使用set 的问题在于它会吹走您的脚本/函数收到的任何位置参数,所以如果您仍然需要那些有问题的参数。如果你有数组,那么使用set 是一种选择,但使用数组也同样有效(而且你可以使用更多数组)。
  • 良好的做法是将位置参数分配给脚本开头附近的命名参数(变量),因此使用set 覆盖它们应该不是问题。这是专门的 Korn shell,但 ksh88 需要不同的语法。
  • 感谢您提供的信息,帮助我更好地理解这一点
【解决方案2】:

set -- * 行将当前目录中的所有文件统称为位置参数。

您可以使用

遍历所有位置参数
for file in "$@"; do
    echo "$file"
done

【讨论】:

  • in "$@" 部分是可选的,是默认的。
  • @cdarke 同意。通常我会放弃它,但在这种情况下,考虑到通过set -- 的位置参数的特定设置,我认为增加的特异性很有用。 (虽然如果我指出 $@ 是位置参数数组会更有用。)
  • 谢谢,这解释得更好。这是执行此过程的最佳方式吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
相关资源
最近更新 更多