gpt4 book ai didi

string - 构建包含用单引号括起来的变量值的 bash 字符串

转载 作者:行者123 更新时间:2023-11-29 09:15:41 24 4
gpt4 key购买 nike

本应是最微不足道的任务让我做噩梦。

我的最终目标是从 bash 脚本发出以下命令:
sqlite3 my_db.db '.read my_file.sql'

这里有两个问题:
1. 单引号是必须的,不能用双引号代替
2. my_file.sql 是一个仅在运行时已知的变量。

所以我需要的是一种让 bash 构建一个字符串的方法,该字符串一方面包含一个变量值,而另一方面该值应该用单引号引起来。

我也更喜欢不依赖 AWK、Perl 等其他工具的解决方案。如果真的有必要,也许 sed 。

谢谢。


谢谢乔纳森和尼尔森。

我尝试了所有三个建议,但都失败了。
为简单起见,我将问题简化为以下内容:

  1. 我编写了以下脚本 (tst.sh):
    #!/bin/bash
    file=/tmp/1
    ls "'"$file"'"
    ls\'$file\'
    ls "'$file'"

  2. 然后我执行以下命令:
    $ touch/tmp/1
    $ ls '/tmp/1'
    /tmp/1
    $./tst.sh
    '/tmp/1': 没有那个文件或目录
    '/tmp/1': 没有那个文件或目录
    '/tmp/1': 没有那个文件或目录

似乎确实添加了引号,但生成的命令与手动输入时不一样。

有什么想法吗?

最佳答案

单引号不是必须的。以下所有命令都使用完全相同的参数运行 sqlite3:

sqlite3 my_db.db '.read my_file.sql'
sqlite3 my_db.db ".read my_file.sql"
sqlite3 my_db.db .read\ my_file.sql
sqlfile="my_file.sql"
sqlite3 my_db.db ".read $sqlfile"

在所有情况下,引号 (/escape) 在参数传递给 sqlite3 之前被解析并删除。这就是你想要的。您希望 sqlite3 获得两个参数:my_db.db.read my_file.sql。您希望 sqlite3 看到命令周围的引号——这相当于:

$ sqlite3 my_db.db
SQLite version 3.7.7 2011-06-25 16:35:41
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> '.read my_file.sql'
...>

...如您所见,这只会混淆 sqlite3。

顺便说一句,这与您的 ls 示例中的问题相同:您将单引号作为参数的一部分传递给 ls,因此它正在查找名称中包含单引号的文件,但没有找到它。您希望 shell 删除引号而不是将它们作为参数的一部分传递给命令。

关于string - 构建包含用单引号括起来的变量值的 bash 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13607308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com