本应是最微不足道的任务让我做噩梦。
我的最终目标是从 bash 脚本发出以下命令:
sqlite3 my_db.db '.read my_file.sql'
这里有两个问题:
1. 单引号是必须的,不能用双引号代替
2. my_file.sql
是一个仅在运行时已知的变量。
所以我需要的是一种让 bash 构建一个字符串的方法,该字符串一方面包含一个变量值,而另一方面该值应该用单引号引起来。
我也更喜欢不依赖 AWK、Perl 等其他工具的解决方案。如果真的有必要,也许 sed 。
谢谢。
谢谢乔纳森和尼尔森。
我尝试了所有三个建议,但都失败了。
为简单起见,我将问题简化为以下内容:
我编写了以下脚本 (tst.sh):
#!/bin/bash
file=/tmp/1
ls "'"$file"'"
ls\'$file\'
ls "'$file'"
然后我执行以下命令:
$ 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/