我有一个列表.txt文件包括日志文件列表。
例如
server_log1
server_log2
........
server_log50
我有另一个 shell 脚本用于下载这些日志。它是这样工作的
./script.sh serverlog1
我想使它自动,这意味着它可以自动传入每个日志文件的名称列表.txt被处决。
那可能吗?我试过
#!/bin/bash
for i in `cat /home/ec2-user/list.txt` ; do
sh ./workaround.sh $i
done
但没有成功
答案1
读取参数的最简单方法可以描述如下;
每个参数都由$IFS
当前定义的 或进行引用和解析internal file separator
。默认字符是空格。
例如,采取以下内容;# ./script.sh arg1 arg2
该示例中的参数列表是arg1 = $1
和arg2 = $2
,可以重写为arg1 arg2 = $@
。
另一个注意事项是日志列表的使用,该列表多久更改一次?我的假设是每天。为什么不使用目录输出作为迭代循环的数组?例如;
for i in $(ls /path/to/logs); do
./workaround.sh $i;
done
或者更好的是,继续functions
在 bash 中使用 来消除混乱。
function process_file()
{
# transfer file code/command
}
function iterate_dir()
{
local -a dir=($(ls $1))
for file in ${dir[@]}; do
process_file $file
done
}
iterate_dir /path/to/log/for
虽然这些只是提高您的 shell 脚本知识的建议,但我必须知道您是否遇到错误,并且还需要了解每个脚本代码和/或功能的详细信息。使用-x
参数也有助于调试脚本。
如果您只是传输日志,您可能希望完全删除脚本并使用rsync
,rsyslog
或者syslog
因为它们都更适合相关任务。
答案2
xargs -n 1 ./script.sh <list.txt
在此示例中,xargs
将./script.sh
使用从其标准输入读取的单个参数执行多次。
list.txt
标准输入通过简单的 shell 输入重定向来自文件。这假设该list.txt
文件每行包含一个与脚本一起使用的参数。
该./script.sh
脚本将为list.txt
文件中的每一行执行一次。
关于-n
旗帜xargs
-n number
调用公用事业使用尽可能多的标准输入参数,
number
最多可达(正十进制整数)个参数。
另一种解决方案是允许脚本直接从 读取list.txt
,或采用多个命令行参数(来自 的条目list.txt
),并分批或分批下载文件。但由于我们不知道脚本的机制是什么,所以我无法详细解释如何执行此操作。
答案3
在脚本内部:您需要一个读取循环,例如while read ; do ......... ; done < filename
将行视为 $REPLY 变量...
例如
while read
do
mv $REPLY $REPLY.old
done < liste.txt
会将 liste.txt 中的任何文件名重命名为 filename.old
现在您已经有了结构,您可以根据您的意思来适应您的需求“在list.txt中要执行的每个日志文件的名称中。” :)
答案4
也许我错误地阅读了这个问题,但我阅读它的方式是如何让我的个人脚本采用多个参数,例如 wget 可以执行“wget url1 url2 url3”
将整个脚本粘贴到以下内容中,其中显示“来自我的脚本的行”,并将此文件保存为新脚本:
ARGUMENTS=$(echo "$@"| tr " " "\n") ; while read A; do "lines from my script";done < "$ARGUMENTS"
请注意,如果您的脚本引用 $1,您必须将其更改为 $A,当然还要检查任何其他引用。
参数存储在名为 $@ 的变量中分隔的一行空间中。这个 hack 使用 tr 来换行换行并将其存储在一个名为 ARGUMENTS 的新变量中。脚本的其余部分针对该变量的每一行运行脚本。
我写这个是为了让我的 bash web scraper 接受一个且仅一个参数来接受多个 url,因此它可能不适用于通常接受多个参数的脚本