如何不将 $ 解释为 bash 脚本

How to not interpret $ into bash script

我制作了一个 bin/bash 命令文件,试图 在 docker 容器中执行不同的命令。

当我启动以下命令时:


password='y$vXBqzZa3oNhMG/3qj10weehWDP4rkfn/R0sctThBb5nLDpLjOlLSu'

docker exec -it ${imageName} /bin/sh -c "mongo -u user -p password --eval \"db = db.getSiblingDB('db'); db.users.insertOne({'role':'Admin', 'name':'aaa', 'email':'a@a.com', 'password': '${password}' }); db.users.find();\" "

它 运行 并成功地将新 'Admin' 用户插入数据库 'db' (mongoDb) 但它错误地解析了 'password' 变量。

{ "_id" : ObjectId("5d7d4aee81d1b750455423ef"), "role" : "Admin", "name" : "aaa", "email" : "a@a.com", "password" : "y0/3qj10weehWDP4rkfn/R0sctThBb5nLDpLjOlLSu" }

我认为 bash 将特殊字符 $ 解释为变量。

所以密码的第一部分: $2y$10$vXBqzZa3oNhMG

变成了: y0

感谢您的帮助。

密码周围的单引号起到了防止 shell 扩展的作用,但是 mongo shell 又如何呢,因为您再次使用 --eval \"db 双引号,这会扩展shell 变量?所以你仍然需要在密码变量中转义 mongo shell 中的 shell 扩展,所以最好在密码中添加转义字符。

password='$2y$10$vXBqzZa3oNhMG/3qj10weehWDP4rkfn/R0sctThBb5nLDpLjOlLSu'
echo ${password}
docker exec -it ${imageName}  \
/bin/sh -c "mongo -u root -p root_password --eval \"db = db.getSiblingDB('db'); db.users.insertOne({'role':'Admin', 'name':'aaa', 'email':'a@a.com', 'password': '${password}' }); db.users.find();\""