Bash shell Mac OS 上的脚本 - 某些命令仅回显到 shell,未执行

Bash shell script on Mac OS - Certain commands only echoed to shell, not executed

我正在尝试让 shell (bash) 脚本在 Mac OS X 10.12.5 机器上运行,使用内置版本 Bash (3.2) 通过终端应用程序附带 OS X 10.12。

我猜这里存在句法问题,但到目前为止我一直无法让其中一个命令按预期执行。每次调用该命令时,它只是将命令回显到 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=
list_name=
name=
id=
desc=

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,但结果是一样的。

如有任何建议,我们将不胜感激!

你是对的:是引用。在刚刚打印的命令中,所有内容 - 包括 | mysqli - 都在单引号 '' 内。因此,bash 将所有这些作为强项传递给 echo,后者会尽职地打印它。

教程 edit 中的那一行要么有这个问题,要么是从某处找到的。 (值得注意的是,它不会转义 SQL 字符,因此如果被除您以外的任何人使用,就会存在安全风险。)稍微改进一下,将变量扩展双引号并移动尾随引号:

echo 'insert into '"${list_name}"' (name, description) values ("'"${name}"'","'"${desc}"'")' | mysql "$dbname"