【问题标题】:ksh wildcard filename parameter to use in for loop在 for 循环中使用的 ksh 通配符文件名参数
【发布时间】:2017-01-31 16:32:23
【问题描述】:

我正在尝试编写一个 shell 脚本,该脚本将采用带通配符的文件名,在当前目录中查找与该模式匹配的所有文件,然后复制它们。我的问题是每次我尝试只使用第一个匹配回声的变量时,就是这样。

./copyfiles.ksh cust*.txt

#! /usr/bin/ksh
IN_FILE=${1}
for file in $IN_FILE
do
    echo "$file"
done

cust1.txt

这似乎只匹配第一个,即使 cust1.txt、cust2.txt 和 cust3.txt 都存在,并且当我使用 cust*.txt 中的文件运行它时,它可以工作。

【问题讨论】:

    标签: ksh


    【解决方案1】:

    shell 将您的“cust*.txt”参数扩展为一个列表,然后将该列表传递给您的脚本,然后脚本仅处理$1,即cust1.txt

    您想使用 $@ 来处理所有传递的参数:

    #! /usr/bin/ksh
    for file in "$@"
    do
        echo "$file"
    done
    

    我相信以这种方式传递的参数数量是有限的。您必须处理多少个文件?确保您的 shell 版本可以处理您可能处理的参数数量。如果我记得您可能需要使用 xargs 的解决方案,但我有点生疏了。

    【讨论】:

      【解决方案2】:

      ./copyfiles.ksh cust*.txt 中的文件 cust*.txt 将首先展开。

      当您不想更改 copyfiles.ksh 脚本时。调用它

      ./copyfiles.ksh "cust*.txt"
      

      你也可以改变你的脚本,比如

      IN_FILE="$@" # INFILES would be a better name
      

      【讨论】:

        猜你喜欢
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-13
        • 2011-01-09
        • 1970-01-01
        相关资源
        最近更新 更多