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

时间:2018-08-29 09:45:34

标签: bash macos shell scripting quoting

我试图通过终端应用程序使用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,但结果相同。

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

1 个答案:

答案 0 :(得分:1)

您是正确的:它在报价。在仅打印的命令中,所有内容-包括| mysqli-都位于单引号''中。因此,bash将所有这些作为强项,并将其传递给echo,由后者严格地打印出来。

教程 edit 中的这一行出现此问题或在某个地方接了它。 (值得注意的是,它不能转义SQL字符,因此如果被您自己以外的任何人使用,则存在安全风险。)稍有改进就是将变量扩展名双引号并移动尾随引号:

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