我当前的脚本如下:
#!/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不是很有经验。谢谢,干杯!答案 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的事实。现有的文件名。