【问题标题】:pass results from find to a custom bash function?将 find 的结果传递给自定义 bash 函数?
【发布时间】:2017-06-10 06:33:52
【问题描述】:

我有一个自定义的 bash 测试函数

main () {
    list=$1
    for i in ${list}; do
        echo $i
    done
}

我试图称之为:

main `find . -name hello` 

但它只是回显列表中传递的第一个文件。 find . -name hello 的原始输出是

./world1/hello
./world2/hello
./world3/hello
./world4/hello
./world5/hello
./world6/hello
./world7/hello
./world8/hello

如何确保整个列表通过?

谢谢!

【问题讨论】:

  • 应该使用函数有什么具体原因吗?我看这里没用
  • 在您的情况下,快速而肮脏的解决方法是将函数中的 $1 替换为 $@

标签: bash function shell loops find


【解决方案1】:

使用正确的 Process-Substitution 语法循环文件,如果您希望对来自 find 输出的每个文件执行特定操作,不需要函数,做吧

#!/bin/bash

while IFS= read -r file
do
    echo "$file"
    # Your other actions on "$file" go here
done < <(find . -type f -name "hello")

(或)如果您害怕文件名中包含特殊字符,例如空格或任何元字符,请使用 -print0 选项(如果支持)(GNU findutils 包)来分隔文件\0 de-limiter 并使用相同的 delimiter 将其读回。

while IFS= read -r -d '' file
do
    echo "$file"
    # Your other actions on "$file" go here
done < <(find . -type f -name "hello" -print0)

我只是简单地建议以这种方式使用函数,但你可以这样做,

function findRead() {   
    while IFS= read -r file
    do
        echo "$file"
        # Your other actions on "$file" go here
     done <<<"$1"    
}

findRead "$(find . -type f -name "hello")"

(或)更简单地做,

function findRead() {    
    for file in "$1"
    do
        echo "$file"
    done
}

findRead "$(find . -type f -name "hello")"

这里的关键是对返回find 的输出的$(..) 命令替换进行双引号,以保留随后提供给您的自定义函数的换行符。

【讨论】:

  • 谢谢!我不太确定我这样做是否正确,但我试过了: main () { while IFS= read -r file do echo "$file" # 你对 "$file" 的其他操作在这里完成 find . -type f -name "OUTCAR" 但它不起作用
  • @lenzinho:你为什么又要使用这个功能了?以这种方式使用它是没有意义的。像我一样使用确切的语法。
  • 我希望使用一个函数,因为我计划在未来多次调用这个函数,并且希望能够灵活地根据情况调用不同的选项
猜你喜欢
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
相关资源
最近更新 更多