如何传入多个参数以使用 .sh 脚本执行

如何传入多个参数以使用 .sh 脚本执行

我有一个列表.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 = $1arg2 = $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参数也有助于调试脚本。

如果您只是传输日志,您可能希望完全删除脚本并使用rsyncrsyslog或者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,因此它可能不适用于通常接受多个参数的脚本

相关内容