bash – 如何在shell脚本字符串中替换变量

前端之家收集整理的这篇文章主要介绍了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')

我有另一个变量保存值:

echo $BATCH_END
2012-11-14 17:06:13

我想用占位符替换值。我对Unix脚本不是特别好,但是我已经尝试过:

echo $sql | sed -e "s/'$BATCH_END/$BATCH_END/g"

但它仍然没有被替换…

谁能帮忙?我想替换占位符,并将最终的字符串保留到$ sql

我还需要知道如何将输出的值重新输入到变量中,例如,我试过:

sql=`echo "$sql" | echo "${sql//\$BATCH_END/$BATCH_END}"`
您的脚本中缺少单引号对的结尾。

更改自:

echo $sql | sed -e "s/'$BATCH_END/$BATCH_END/g"

至:

echo $sql | sed -e "s/\$BATCH_END/$BATCH_END/g"

更新 – 按照后续评论

要将上述替换的结果保存回$ 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"`

这被称为command substitution.语法($(…)与反引号的机箱)有效,但首选可以让您进行嵌套。

首选方式:Herestring

这可能比您所关心的更高级,但以下列方式可以节省您不必使用echo的子进程:

sql=$(sed -e "s/\$BATCH_END/$BATCH_END/g" <<< $sql)

猜你在找的Bash相关文章