代码之家  ›  专栏  ›  技术社区  ›  abkrim

如何在backticks中传递bash变量[duplicate]

  •  1
  • abkrim  · 技术社区  · 6 年前

    这个问题已经有了答案:

    首先,我为我的英格利什感到抱歉,因为我不知道正确的名字 ` “(反勾号)

    在SQL转储文件中,我需要在数据库转储上提取块,所有数据库都以下面的代码开头,而他的SQL转储以其他数据库的下一个块结尾,

    --
    -- Current Database: `current_database`
    --
    
    
    // some sql code
    
    --
    -- Current Database: `next_database`
    --
    
    for d in $(cat file_with_databasesnames.txt);do echo $d;LC_ALL=C sed -n '/^-- Current Database: `database_name`/,/^-- Current Database: `/p' mysqldump.sql > $d.sql
    

    在代码上,我需要传递值$d而不是数据库名

    我尝试了几种方法,但都失败了。

    `${d}`
    `$d`
    \`$d\`
    

    我用

    bash --version
    GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
    Copyright (C) 2007 Free Software Foundation, Inc.
    

    关闭后编辑为重复。

    反勾 单引号 是吗?我想没有。

    1 回复  |  直到 6 年前
        1
  •  1
  •   that other guy    6 年前

    这与你的倒数无关,完全是由于你的单引号。见 this question 了解如何在单引号字符串中使用变量。下面是根据这个问题修复的示例:

    for d in $(cat file_with_databasesnames.txt)
    do
      echo $d;
      LC_ALL=C sed -n '/^-- Current Database: `'"$d"'`/,/^-- Current Database: `/p' mysqldump.sql > $d.sql
    done
    

    下面是一个示例,说明它的工作原理:

    $ cat file_with_databasesnames.txt
    mytarget
    
    $ cat mysqldump.sql
    -- Current Database: `users`
    Some dump here
    -- Current Database: `mytarget`
    This is what you want
    -- Current Database: `etc`
    And so on
    
    $ for d in $(cat file_with_databasesnames.txt)
    do
      echo $d;
      LC_ALL=C sed -n '/^-- Current Database: `'"$d"'`/,/^-- Current Database: `/p' mysqldump.sql > $d.sql
    done
    mytarget
    
    $ cat mytarget.sql
    -- Current Database: `mytarget`
    This is what you want
    -- Current Database: `etc`
    

    这里有一个版本,对阅读行进行了一般性的改进 while read 循环并以明确的形式显示数据库名称:

    while IFS= read -r db
    do
      printf 'Processing: %q\n' "$db"
      LC_ALL=C sed -n '/^-- Current Database: `'"$db"'`/,/^-- Current Database: `/p' mysqldump.sql > "$db.sql"
    done < file_with_databasesnames.txt