Linux 如何使这个(l)unix脚本在for循环中动态接受目录名?
我正在自学更多的unix技能,想看看是否可以开始编写一个程序,最终读取所有的.gz文件并进行扩展。然而,我希望它是超级动态的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
#!/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:你赢了我一拳!该添加内容已在我的编辑窗口中。:)谢谢约翰和杰夫。我从这个问题中学到了很多!你们俩都很棒。我感到鼓舞,继续学习,并衡量这两种方法的优点。谢谢。我肯定给了你这个答复的代表。非常感谢。