Сценарий оболочки Bash в Mac OS - некоторые команды отображаются только в оболочке, но не выполняются - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь получить сценарий оболочки (bash), работающий на компьютере Mac OS X 10.12.5, используя встроенную версию Bash (3.2), которая поставляется с OS X 10.12 через приложение Terminal.

Я предполагаю, что здесь есть синтаксическая проблема, но я до сих пор не смог заставить одну из команд выполнить так, как ожидалось. Каждый раз, когда команда вызывается, она просто выводит команду в оболочку, но не выполняет ее.

Другая существующая в сценарии команда выполняется без проблем, поэтому я предполагаю, что эта проблема как-то связана с используемыми там одинарными кавычками / двойными кавычками / скобками.

Сценарий был взят из учебного пособия, которому я следовал, чтобы изучать сценарии Bash, поэтому я считаю, что это будет хорошо работать на оболочке Linux Bash, но я не пытаюсь использовать это через 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'

(... Последний соответствует тому, что было включено в оригинальный урок)

Я также установил Bash 4.4 через Homebrew, но результаты были такими же.

Буду признателен за любой совет!

1 Ответ

0 голосов
/ 29 августа 2018

Вы правы: это цитата. В команде, которая просто печатает, все - включая | mysqli - находится в одинарных кавычках ''. Следовательно, bash воспринимает все это как сильное и передает его echo, который покорно печатает его.

Строка из урока edit либо имеет эту проблему, либо где-то ее обнаружила. (Примечательно, что он не экранирует символы SQL и, следовательно, представляет угрозу безопасности, если используется кем-либо, кроме вас.) Небольшое улучшение заключалось бы в двойных кавычках расширений переменных, а также в перемещении конечной кавычки:

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