AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 425828
Accepted
The One
The One
Asked: 2018-02-22 23:28:45 +0800 CST2018-02-22 23:28:45 +0800 CST 2018-02-22 23:28:45 +0800 CST

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

  • 772

我有一个包含日志文件列表的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

但它没有用

linux shell-script
  • 5 5 个回答
  • 55941 Views

5 个回答

  • Voted
  1. Best Answer
    jas-
    2018-02-23T03:32:59+08:002018-02-23T03:32:59+08:00

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

    每个参数都由$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
    

    或者更好的是,继续使用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
    

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

    如果您只是简单地传输日志,您可能希望一起取消脚本并使用rsync,rsyslog或者syslog因为它们都更适合相关任务。

    • 5
  2. Kusalananda
    2018-02-23T03:48:21+08:002018-02-23T03:48:21+08:00
    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
  3. francois P
    2018-02-22T23:33:49+08:002018-02-22T23:33:49+08:00

    在脚本内部:您需要一个读取循环,例如while read ; do ......... ; done < filename将行视为 $REPLY 变量...

    例如

    while read 
    do
    mv $REPLY $REPLY.old
    done < liste.txt
    

    将 liste.txt 中的任何文件名重命名为 filename.old

    你现在有了结构,你可以根据你的意思来适应你的需要,“在 list.txt 中每个日志文件的名称中要执行”。 :)

    • 2
  4. nxnev
    2018-02-23T05:45:07+08:002018-02-23T05:45:07+08:00

    (注:我个人认为Kusalananda 的方法在这种特定场景下是最好的,所以我只是添加一些解释性信息和建议)


    不要阅读与for

    使用这种方法,您:

    • 依靠分词来使事情顺利进行。
    • 是像globbing这样的意外副作用的主题。
    • 将整个文件一次性全部放入内存(可能是大文件的问题)。

    while+read方法更可取,但它不是万无一失的解决方案:

    while IFS= read -r line; do
      # Your code here
    done < file
    

    引用你的变量

    写"$i"而不是$i. 未加引号的变量可能是 shell 脚本中错误和安全漏洞的主要来源。

    相关问题:

    • 为什么我的 shell 脚本会因空格或其他特殊字符而窒息?
    • 忘记在 bash/POSIX shell 中引用变量的安全隐患

    使用$(...)代替`...`

    $(...)是 POSIX 兼容的,可以更容易地嵌套。


    您还可以修改脚本以支持多个参数甚至一个--batch选项。

    如果您不知道从哪里开始,我有一个支持这些功能的示例/模板脚本(不过它使用 Bash 特定的语法)。

    使用示例:

    $ cat list.txt
    list_item_1
    list_item_2
    list_item_3
    $ script --batch list.txt item_1 item_2
    Operands:
      1: [list_item_1]
      2: [list_item_2]
      3: [list_item_3]
      4: [item_1]
      5: [item_2]
    
    • 2
  5. unifex
    2021-01-02T15:49:13+08:002021-01-02T15:49:13+08:00

    也许我读错了这个问题,但我读它的方式是如何让我的个人脚本接受多个参数,例如 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 网络爬虫接受一个并且只有一个参数来接受多个 url,所以它可能不适用于通常接受多个参数的脚本

    • 0

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 按分隔符拆分并连接字符串问题

  • astyle 不会更改源文件格式

  • MySQL Select with function IN () with bash array

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve