如何替换shell脚本字符串中的变量

Ric*_*d G 21 bash shell

我有问题让这个工作......

我有一个带占位符的SQL变量:

echo $SQL
SELECT PX_PROMOTION_ID, PRIORITY, STATUS, EXCLSVE, TYPE, PERORDLMT, PERSHOPPERLMT, TOTALLMT, RSV_INT, PX_GROUP_ID, CAMPAIGN_ID, STOREENT_ID, VERSION, REVISION, EFFECTIVE, TRANSFER, CDREQUIRED, EXPIRE, LASTUPDATEBY, TO_CHAR(LASTUPDATE, 'YYYYMMDD HH24MMSS') AS LASTUPDATE, TO_CHAR(STARTDATE, 'YYYYMMDD HH24MMSS') AS STARTDATE, TO_CHAR(ENDDATE, 'YYYYMMDD HH24MMSS') AS ENDDATE, TO_CHAR(RSV_TIME, 'YYYYMMDD HH24MMSS') AS RSV_TIME, RSV_REAL, TGTSALES, NAME, CODE, RSV_VCH, OPTCOUNTER FROM PX_PROMOTION WHERE LASTUPDATE BETWEEN (SELECT MAX(BATCHSTART) FROM XRPTEBATCHCONTROL) AND TIMESTAMP('$BATCH_END')
Run Code Online (Sandbox Code Playgroud)

我有另一个保存值的变量:

echo $BATCH_END
2012-11-14 17:06:13
Run Code Online (Sandbox Code Playgroud)

我想用值替换占位符.我在Unix脚本方面不是特别出色,但我试过这个:

echo $SQL | sed -e "s/'$BATCH_END/$BATCH_END/g"
Run Code Online (Sandbox Code Playgroud)

但它仍然没有被取代......

有人可以帮忙吗?我想替换占位符,并保持最终字符串分配给$ SQL

我还需要知道如何将输出的值返回到变量中,例如,我尝试过:

 SQL=`echo "$SQL" | echo "${SQL//\$BATCH_END/$BATCH_END}"`
Run Code Online (Sandbox Code Playgroud)

sam*_*hen 41

您缺少脚本中单引号对的结尾.

改变自:

echo $SQL | sed -e "s/'$BATCH_END/$BATCH_END/g"
Run Code Online (Sandbox Code Playgroud)

至:

echo $SQL | sed -e "s/\$BATCH_END/$BATCH_END/g"
Run Code Online (Sandbox Code Playgroud)

更新 - 根据后续评论:

要将上述替换的结果保存回来$SQL,请执行以下任一操作:

# Preferred way
SQL=$(echo $SQL | sed -e "s/\$BATCH_END/$BATCH_END/g")

# Old way
SQL=`echo $SQL | sed -e "s/\$BATCH_END/$BATCH_END/g"`
Run Code Online (Sandbox Code Playgroud)

这称为命令替换.语法($(...)与反引号的封装相比)都有效,但首选的语法允许您进行嵌套.

首选 -preferred方式:Herestring

这可能比您关心的更先进,但是以下面的方式执行它将为您节省echo不必要的子进程:

SQL=$(sed -e "s/\$BATCH_END/$BATCH_END/g" <<< $SQL)
Run Code Online (Sandbox Code Playgroud)