【问题标题】:Read from file into variable - Bash Script从文件读入变量 - Bash 脚本
【发布时间】:2014-04-30 14:16:15
【问题描述】:

我正在编写一个 bash 脚本来备份 MySQL。我需要从文件中读取一系列字符串并将它们传递给脚本中的变量。示例:

类似的内容将在文件 (file.txt) 中

database1 table1
database1 table4
database2
database3 table2

我的脚本需要读取文件并将这些字符串放在一个变量中,例如:

#! bin/bash
LIST="database1.table1|database1.table4|database2|database3.table2"

编辑。我改变了主意,现在我需要这个输出:

database1.table1.*|database1.table4.*|database2*.*|database3.table2.*

【问题讨论】:

  • 到目前为止你尝试过什么?
  • 你也需要修复shebang,应该是#!/bin/bash

标签: mysql linux bash list shell


【解决方案1】:

您可以使用tr 替换换行符和空格:

LIST=$(tr ' \n' '.|' < file.txt)

由于输入文件的最后一行本身可能包含换行符,因此您需要删除它:

LIST=$(tr ' ' '.' < file.txt | paste -sd'|')

【讨论】:

    【解决方案2】:

    使用 awk:

    s=$(awk '{$1=$1}1' OFS='.' ORS='|' file)
    LIST="${s%|}"
    
    echo "$LIST"
    database1.table1|database1.table4|database2|database3.table2
    

    【讨论】:

    • 这太棒了!!我忘了提一件事。我还需要在输出字符串中添加一些通配符。条件是:如果我们读取 database2,输出应该是 database2*.*,如果我们读取一个数据库和一个表,输出应该是 database1.table1.* 我要寻找的最终结果是:database1.table1.*| database1.table4.*|database2*.*|database3.table2.* 请帮忙:)
    • 这实际上改变了问题的本质。如果您打开一个链接到此问题的新问题,我将尝试解决它。​​
    • 我可以知道答案有什么问题,因为您不接受它。
    【解决方案3】:

    bash(我相信是第 4 版)

    mapfile -t lines < file.txt           # read lines of the file into an array
    lines=("${lines[@]// /.}")            # replace all spaces with dots 
    str=$(IFS='|'; echo "${lines[*]}")    # join the array with pipe
    echo "$str"
    
    database1.table1|database1.table4|database2|database3.table2
    

    mapfile -t lines < file.txt
    for ((i=0; i<${#lines[@]}; i++)); do
        [[ ${lines[i]} == *" "* ]] && lines[i]+=" *" || lines[i]+="* *"
    done
    str=$(IFS='|'; echo "${lines[*]// /.}") 
    echo "$str"
    
    database1.table1.*|database1.table4.*|database2*.*|database3.table2.*
    

    【讨论】:

    • 您不需要辅助变量,因为目的只是打印到标准输出。在子shell 中(IFS='|'; echo "${lines[*]}") 就足够了。实际上,你甚至不需要辅助线:mapfile -t lines &lt; files.txt; (IFS='|'; echo "${lines[*]// /.}")
    • 我怎样才能得到这个输出而不是database1.table1.*|database1.table4.*|database2*.*|database3.table2.* - 请注意.* vs *.* - 换句话说:如果只有没有表的数据库,我需要添加*.* at最后,当有一个 database.table 我需要添加 .*
    【解决方案4】:

    如果新行没有出现在数据中,您可以使用 sed 将新行替换为您需要的字符。

    例如

    FOO=$(sed '{:q;N;y/ /./;s/\n/|/g;t q}' /home/user/file.txt)
    

    【讨论】:

    • 我怎样才能得到这个输出而不是database1.table1.*|database1.table4.*|database2*.*|database3.table2.* - 请注意.* vs *.* - 换句话说:如果只有没有表的数据库我需要添加*.* at最后,当有一个 database.table 我需要添加 .*
    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 2014-06-18
    • 2021-08-01
    • 2019-09-19
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多