如何从shell脚本中获取sql的参数值

时间:2014-09-04 08:29:54

标签: sql shell

我使用shell脚本运行sqlite3命令,代码如下:

idd=0;
/usr/bin/sqlite3 ~/Library/Application\ Support/NotificationCenter/*.db <<SQL_END
select app_id from app_info where bundleid='com.myapp.main';
select last_known_path from app_loc where app_id=29;
SQL_END

我想获得sql的last_konwn_path,我想转移参数而不是使用&#39; 29&#39;任何人都可以帮助我,谢谢。

1 个答案:

答案 0 :(得分:1)

字符串插值,替换双引号字符串中的变量的机制,发生在here-documents中。因此,您可以将函数包装在函数中,如下所示:

# notificationdb_last_known_path APP_ID
notificationdb_last_known_path()
{
  local APP_ID
  APP_ID="$1"
  /usr/bin/sqlite3 ~/Library/Application\ Support/NotificationCenter/*.db <<SQL_END
  select app_id from app_info where bundleid='com.myapp.main';
  select last_known_path from app_loc where app_id=${APP_ID};
  SQL_END
}

然后您可以像这样调用此函数将答案存储在变量中:

my_app_id=$(notificationdb_last_known_path 29)

对sqlite调用进行分解 如果您有几个类似的数据库访问,则值得将sqlite调用分解如下:

# notificationdb_session()
{
  /usr/bin/sqlite3 ~/Library/Application\ Support/NotificationCenter/*.db
}

# notificationdb_last_known_path_query APP_ID
notification_last_known_path_query()
{
  local APP_ID
  APP_ID="$1"
  cat <<SQL_END
  select app_id from app_info where bundleid='com.myapp.main';
  select last_known_path from app_loc where app_id=${APP_ID};
  SQL_END
}

# notificationdb_last_known_path_query APP_ID
notificationdb_last_known_path()
{
  notificationdb_last_known_path_query "$1" | notificationdb_session
}

不存储变量 在shell编程中,当流程之间的数据流传递通过变量时,传递结构化数据更容易。在处理结构化数据流时,计划sortcutpastejoinawk特别有用。

在here-documents 中禁用文本插值 如果需要在here-document中禁用文本插值,可以通过在单引号之间编写here-document分隔符来实现此目的,如

cat <<'SQL_END'
SQL_STATEMENT
SQL_END