我有一个包含日志文件列表的list.txt文件。
例如
server_log1
server_log2
........
server_log50
我有另一个用于下载这些日志的 shell 脚本。它像这样工作
./script.sh serverlog1
我想让它自动执行,这意味着它可以自动传递list.txt中每个日志文件的名称来执行。
那可能吗?我试过了
#!/bin/bash
for i in `cat /home/ec2-user/list.txt` ; do
sh ./workaround.sh $i
done
但它没有用
读取参数的最简单方法可以描述如下;
每个参数都由
$IFS
或 当前定义的 引用和解析internal file separator
。默认字符是空格。例如,采取以下措施;
# ./script.sh arg1 arg2
该示例中的参数列表是
arg1 = $1
并且arg2 = $2
可以重写为arg1 arg2 = $@
。另一个注意事项是使用日志列表,它多久更改一次?我的假设是每天。为什么不使用目录输出作为迭代循环的数组?例如;
或者更好的是,继续使用
functions
in bash 来消除混乱。虽然这些只是提高您的 shell 脚本知识的建议,但我必须知道您是否遇到错误,并且还需要了解每个脚本代码和/或功能的详细信息。使用该
-x
参数也有助于调试脚本。如果您只是简单地传输日志,您可能希望一起取消脚本并使用
rsync
,rsyslog
或者syslog
因为它们都更适合相关任务。在此示例中,
xargs
将使用从其标准输入中读取的单个参数执行./script.sh
多次。list.txt
标准输入通过简单的 shell 输入重定向来自文件。这假定该list.txt
文件包含一个参数,每行与脚本一起使用。该
./script.sh
脚本将为文件中的每一行执行一次list.txt
。关于
-n
国旗xargs
另一种解决方案是允许脚本直接从 读取
list.txt
,或采用多个命令行参数(来自 的条目list.txt
),并分批下载文件。但是由于我们不知道脚本的机制是什么,所以我无法详细解释如何执行此操作。在脚本内部:您需要一个读取循环,例如
while read ; do ......... ; done < filename
将行视为 $REPLY 变量...例如
将 liste.txt 中的任何文件名重命名为 filename.old
你现在有了结构,你可以根据你的意思来适应你的需要,“在 list.txt 中每个日志文件的名称中要执行”。 :)
(注:我个人认为Kusalananda 的方法在这种特定场景下是最好的,所以我只是添加一些解释性信息和建议)
不要阅读与
for
使用这种方法,您:
while
+read
方法更可取,但它不是万无一失的解决方案:引用你的变量
写
"$i"
而不是$i
. 未加引号的变量可能是 shell 脚本中错误和安全漏洞的主要来源。相关问题:
使用
$(...)
代替`...`
$(...)
是 POSIX 兼容的,可以更容易地嵌套。您还可以修改脚本以支持多个参数甚至一个
--batch
选项。如果您不知道从哪里开始,我有一个支持这些功能的示例/模板脚本(不过它使用 Bash 特定的语法)。
使用示例:
也许我读错了这个问题,但我读它的方式是如何让我的个人脚本接受多个参数,例如 wget 可以执行“wget url1 url2 url3”
将您的整个脚本粘贴到下面的“我的脚本中的行”中,并将此文件保存为您的新脚本。:
请注意,如果您的脚本引用 $1,则必须将其更改为 $A,当然还要检查任何其他引用。
参数存储在一个名为 $@ 的变量中分隔的行空间中。这个 hack 使用 tr 用新行交换空格并将其存储在一个名为 ARGUMENTS 的新变量中。脚本的其余部分为该变量的每一行运行脚本。
我写这个是为了让我的 bash 网络爬虫接受一个并且只有一个参数来接受多个 url,所以它可能不适用于通常接受多个参数的脚本