我试图通过终端应用程序使用OS X 10.12随附的内置版本的Bash(3.2)在Mac OS X 10.12.5机器上运行Shell(bash)脚本。
我猜这里有一个语法问题,但是到目前为止,我一直无法获得要执行的命令之一。每次调用该命令时,它只是将命令回显到Shell,但不执行该命令。
该脚本中存在的另一个命令可以毫无问题地执行,因此我猜想这个问题与那里使用的单引号/双引号/中括号有关。
该脚本来自我一直在学习Bash脚本的教程,因此我相信这在Linux Bash shell上可以正常使用,但是我并不想通过Linux使用它。
脚本看起来像..
#!/bin/bash
dbname="testdb"
table_layout="(id int not null auto_increment, primary key(id), name varchar(255), description text)"
action=$1
list_name=$2
name=$3
id=$3
desc=$4
if [[ $# -lt 1 ]]
then
echo "******************************"
echo "Task Application from tutorial"
echo "******************************"
echo ""
echo "Usage:"
echo "task (new-list)|del-list|add|del|ls)"
echo "new-list: Create a new list"
echo "del-list: Delete a list and all tasks inside the list"
echo "add: task add list_name task_name task_description - creates a new task"
echo "del: task del list_name task_id deletes a working task"
echo "ls: task ls - lists tasks, task ls list_name, lists tasks in a list"
echo ""
echo ""
fi
function create_list {
echo create table $list_name$table_layout | mysql $dbname
}
function add_task {
echo 'insert into "${list_name}" (name, description) values ("${name}","${desc}") | mysql $dbname'
}
但是我遇到问题的命令就是这个。.(添加任务命令)
echo 'insert into "${list_name}" (name, description) values ("${name}","${desc}") | mysql $dbname'
我也尝试过使用上面的代码,像这样:
echo `insert into "${list_name}" (name, description) values ("${name}","${desc}") | mysql $dbname`
和...
echo `insert into `${list_name}` (name, description) values ("`${name}`","`${desc}`") | mysql $dbname`
以及...
echo 'insert into '${list_name}' (name, description) values ("'${name}'","'${desc}'") | mysql $dbname'
(...最后一个匹配原始教程中包含的内容)
我还通过Homebrew安装了Bash 4.4,但结果相同。
任何建议,我们将不胜感激!
答案 0 :(得分:1)
您是正确的:它在报价。在仅打印的命令中,所有内容-包括| mysqli
-都位于单引号''
中。因此,bash将所有这些作为强项,并将其传递给echo
,由后者严格地打印出来。
教程 edit 中的这一行出现此问题或在某个地方接了它。 (值得注意的是,它不能转义SQL字符,因此如果被您自己以外的任何人使用,则存在安全风险。)稍有改进就是将变量扩展名双引号并移动尾随引号:
echo 'insert into '"${list_name}"' (name, description) values ("'"${name}"'","'"${desc}"'")' | mysql "$dbname"