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"
我正在尝试让 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"