【问题标题】:Bash shell script on Mac OS - Certain commands only echoed to shell, not executedMac OS 上的 Bash shell 脚本 - 某些命令只回显到 shell,不执行
【发布时间】:2019-02-04 01:28:35
【问题描述】:

我正在尝试通过终端应用程序使用 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,但结果是一样的。

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

【问题讨论】:

  • 你想要echo "insert into \"${list_name}\" (name, description) values (\"${name}\",\"${desc}\")" | mysql "$dbname"
  • 顺便说一下,请查看tour 了解有关网站运行方式的更多信息。欢迎!

标签: bash macos shell scripting quoting


【解决方案1】:

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

教程 edit 中的行要么有这个问题,要么在某个地方捡到了它。 (值得注意的是,它不会转义 SQL 字符,因此如果您以外的任何人使用它会带来安全风险。)稍微改进一下是双引号变量扩展以及移动尾随引号:

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

【讨论】:

  • 非常感谢!这解决了这个问题。据我所知,本教程并没有过多关注(或考虑)安全性,因此也感谢您指出其中的安全风险。
  • @GuyMason 很高兴听到它!另请参阅wiki.bash-hackers.org/syntax/quoting,了解更多关于各类报价之间差异的详细信息。
  • 安全地将任意 shell 变量传递给 SQL 是困难——我曾经为此编写了自己的 Python 客户端。我相信psql 这些天有一些可用的工具,虽然我不知道 mysql 是否有。
猜你喜欢
  • 2020-06-24
  • 2014-02-23
  • 1970-01-01
  • 2016-10-07
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 2014-01-11
相关资源
最近更新 更多