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

The*_*One 6 linux shell-script arguments

我有一个包含日志文件列表的list.txt文件。

例如

    server_log1
    server_log2
    ........
    server_log50
Run Code Online (Sandbox Code Playgroud)

我有另一个 shell 脚本用于下载这些日志。它是这样工作的

./script.sh serverlog1
Run Code Online (Sandbox Code Playgroud)

我想自动生成,这意味着它可以自动在list.txt传入要执行的每个日志文件的名称。

那可能吗?我试过

#!/bin/bash
for i in `cat /home/ec2-user/list.txt` ; do
sh ./workaround.sh $i
done
Run Code Online (Sandbox Code Playgroud)

但它没有用

jas*_*as- 5

读取参数的最简单方法可以描述如下;

每个参数都由$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
Run Code Online (Sandbox Code Playgroud)

或者更好的是,继续使用functionsin 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
Run Code Online (Sandbox Code Playgroud)

虽然这些只是提高您的 shell 脚本知识的建议,但我必须知道您是否遇到错误,并且还需要了解每个脚本代码和/或功能的详细信息。使用-x参数也有助于调试脚本。

如果您只是传输日志,您可能希望将所有脚本一起删除并使用rsyncrsyslog或者syslog因为它们都更适合所讨论的任务。