Linux 如何使这个(l)unix脚本在for循环中动态接受目录名?

Linux 如何使这个(l)unix脚本在for循环中动态接受目录名?,linux,bash,unix,for-loop,terminal,Linux,Bash,Unix,For Loop,Terminal,我正在自学更多的unix技能,想看看是否可以开始编写一个程序,最终读取所有的.gz文件并进行扩展。然而,我希望它是超级动态的 #!/bin/bash dir=~/derp/herp/path/goes/here for file in $(find dir -name '*gz') do echo $file done 所以,当我执行这个文件时,我只是去 bash derp.sh 我不喜欢这个。我觉得剧本太脆弱了。 我如何重新设计for循环,以便 b

我正在自学更多的unix技能,想看看是否可以开始编写一个程序,最终读取所有的.gz文件并进行扩展。然而,我希望它是超级动态的

    #!/bin/bash

dir=~/derp/herp/path/goes/here

for file in $(find dir -name '*gz')
    do 
       echo $file
    done
所以,当我执行这个文件时,我只是去

bash derp.sh

我不喜欢这个。我觉得剧本太脆弱了。 我如何重新设计for循环,以便

bash derp.sh ~/derp/herp/path/goes/here (1) 
我尝试按如下方式重新编码:

for file in $*
但是,我不想输入bash

derp.sh ~/derp/herp/path/goes/here/*.gz. 
我如何重写它,以便我可以简单地键入(1)中的内容?我觉得我一定错过了一些简单的事情

注 我试过了

用于$*/*.gz中的文件,这显然不起作用。感谢您的帮助,我的资料来源是wrox unix文本、carpentry v5和man文件。不幸的是,我还没有找到我想要的东西

谢谢, GeekyOmega

for dir in "$@"
do
    for file in "$dir"/*.gz
    do 
       echo $file
    done
done
注:

  • 在外部循环中,
    dir
    被依次分配给命令行上给定的每个参数。使用特殊形式
    “$@”
    ,以便正确处理包含空格的目录名

  • 内部循环在给定目录中的每个
    .gz
    文件上运行。通过将
    $dir
    放在双引号中,即使目录名包含空格,循环也能正常工作。如果
    gz
    文件名有空格,此表单也将正常工作

您可能更喜欢
“$@”
而不是
$*
;如果文件名中有空格,比如名为
mydocuments
的目录和名为
Music
的目录,
$*
将有效地扩展为:

find My Documents Music -name '*.gz'
find "My Documents" "Music" -name '*.gz'
其中“$@”将扩展为:

find My Documents Music -name '*.gz'
find "My Documents" "Music" -name '*.gz'

必要注意:对$(find…)中的文件使用
通常被认为是一种不好的做法,因为如果目录结构中有空格或换行符,它确实会中断。使用嵌套for循环(如John的回答)通常是一个更好的主意,或者使用
find-print0
read
如中所示。

很酷。谢谢你输入有关$@@的内容。@John1024:你赢了我一拳!该添加内容已在我的编辑窗口中。:)谢谢约翰和杰夫。我从这个问题中学到了很多!你们俩都很棒。我感到鼓舞,继续学习,并衡量这两种方法的优点。谢谢。我肯定给了你这个答复的代表。非常感谢。