【发布时间】:2014-04-29 23:49:34
【问题描述】:
当给定特定 ID、姓氏和名字时,我有一个搜索重复 ID 的数据库脚本。这是它的肉和土豆:
PSQL="psql -p $PGPORT -h $DBHOST -d $DB -tAc "
DUP_ID=$($PSQL "SELECT id FROM inmate WHERE id NOT SIMILAR TO '(0*)${1}' AND lastname ILIKE '${_LNAME}' AND firstname ILIKE '${_FNAME}' LIMIT 1")
效果很好,除非姓氏或名字中包含撇号,例如“O'Neil”。我试图逃避任何 'with \' 的实例,但还没有成功。我花了一整天的时间搜索论坛,并自己尝试了不同的变体,但仍然不会在每个 ' 前面添加 \。
这是我目前得到的:
local _LNAME=`echo "${2}" | sed "s/'/\\\'/g"`
local _FNAME=`echo "${3}" | sed "s/'/\\\'/g"`
echo -e $_LNAME
echo -e $_FNAME
# Output
O'Neil
Robert
一如既往,提前致谢!
【问题讨论】:
-
echo | sed是怎么回事? Bash 具有用于执行字符串操作的内置参数扩展运算符;例如,您可以运行:in="'"; out="\\'"; escaped_lname=${lname//$in/$out},这将比尝试使用 sed 玩游戏更快、更高效。 -
...另外,请注意,全大写是环境变量和内置函数的惯例。脚本的本地变量应至少包含一个小写字符,以避免与这些类发生命名空间冲突。
-
...另外,
echo -e是(如echo -n)非 POSIX 且通常已弃用;printf对于echo的所有非常简单的用法都是首选。如果您想以人类可读的方式显示变量的内容,printf '%q\n' "$_lname"将是一个更好的习惯——它甚至可以以可以显示的格式显示换行符、回车符和其他不可打印的字符重新进入外壳。