bash:filenames作为参数,在循环中执行操作

时间:2018-03-13 13:23:45

标签: bash for-loop parameters

我当前的脚本如下:

#!/bin/bash

victims=*asci*

for f in $victims ; do
awk /some blah blah here/  ;done

所以基本上会在其名称中包含所有包含 ascii 的文件并对它们执行操作。

但是,我希望将文件名作为参数输入。喜欢: 例如bash myscript.sh *log*

使用时

#!/bin/bash

victims="$1"

for f in $victims ; do
awk /some blah blah here/  ;done

它没有做到预期的。仅在第一个文件上执行(据我记得)。

我可以请求帮忙吗?希望脚本对包含其文件名中的参数的一堆文件执行功能。老实说,我对bash不是很有经验。谢谢,干杯!

2 个答案:

答案 0 :(得分:3)

如果您只是致电awk,那么您甚至不需要for循环。只需立即传递所有文件名即可。

awk '/whatever/' "$@"

如果您想要遍历所有命令行参数,请写:

for f in "$@"; do
    ...
done

或者,因为暗示in "$@"

for f; do
    ...
done

如果要将它们存储在中间变量中,则需要使用数组:

victims=("$@")

for f in "${victims[@]}"; do
    ...
done

此外,您应该避免显式调用bash。直接运行脚本,以便它可以使用其shebang行中列出的任何shell。

bash myscript.sh *log*
./myscript.sh *log*

答案 1 :(得分:1)

您需要注意如何调用脚本。假设您的脚本myscript.sh只是

victims="$1"
echo "$victims"

,你的cwd包含文件a.log,another.log和logmore.txt。

然后,执行

myscript.sh *log*

Wil简单地导致

a.log

因为" *log*"在调用myscript.sh之前由shell解释。事实上,你正在执行

myscript.sh a.log another.log logmore.txt

并且您的脚本只处理第一个参数。同样非常有趣的是,当你的cwd中没有包含" log"在其名称中,您的脚本将导致:

*log*

所以,你的电话应该是:

myscript.sh "*log*"

并且您的脚本应该处理它的输入可能是一个正则表达式iso的事实。现有的文件名。