我有一个文件VALIDATION_CONFIG_FILE.cfg,其中包含以下记录:
ES_VDF_1|1
DE_VDF_1|2
ES_VDF_1|7
当我通过使用变量使用下面的grep
命令时,命令返回ES_VDF_1
输出。根据我的理解,命令不应该给出任何结果。当我使用相同的命令而不使用变量(直接使用值)时,命令返回没有结果,这是预期的。那么我使用的变量有什么问题呢?
FEED_ID_1_7="HU_VDF_1"
FEED_ID_2_7="ES_VDF_1"
FEED_ID_3_7="PT_VDF_2"
awk -F'|' '{ if($2=="7") print $1; }' VALIDATION_CONFIG_FILE.cfg |
grep -E -v '${FEED_ID_1_7}|${FEED_ID_2_7}|${FEED_ID_3_7}'
输出:ES_VDF_1
awk -F'|' '{ if($2=="7") print $1; }' VALIDATION_CONFIG_FILE.cfg |
grep -E -v 'ES_VDF_1|HU_VDF_1|PT_VDF_2'
输出:没有
答案 0 :(得分:2)
你看到的问题是Bash中的单引号不插入变量,而双引号则插入变量。
例如,变量富有想象力地称为" VARIABLE":
alex@yuzu:~$ export VARIABLE="foo"
如果用双引号回显它,则进行插值并使用变量的值:
alex@yuzu:~$ echo "$VARIABLE"
foo
但是,如果你使用单引号,那么文字字符串' $ VARIABLE'改为使用:
alex@yuzu:~$ echo '$VARIABLE'
$VARIABLE
你的grep也一样。
grep -E -v '${FEED_ID_1_7}|${FEED_ID_2_7}|${FEED_ID_3_7}'
应该是:
grep -E -v "${FEED_ID_1_7}\|${FEED_ID_2_7}\|${FEED_ID_3_7}"
例如:
alex@yuzu:~$ echo "foo" | grep -E "$VARIABLE|$HOME|$USER"
foo
alex@yuzu:~$ echo "foo" | grep -E '$VARIABLE|$HOME|$USER'
[ no output ]
答案 1 :(得分:2)
由于报价,这种情况正在发生。
单引号不会插入任何内容,但双引号会这样做。将单引号替换为带引号的双引号,如下所示:
awk -F'|' '{ if($2=="7") print $1; }' VALIDATION_CONFIG_FILE.cfg |
grep -E -v "${FEED_ID_1_7}|${FEED_ID_2_7}|${FEED_ID_3_7}"
有关详细信息,请参阅bash manual
答案 2 :(得分:1)
根据Kaoru / Nishu Tayal的回答,您可以通过fgrep
和多个-e
使用普通文本搜索来进一步提高安全性:
fgrep -v -e "${FEED_ID_1_7}" -e "${FEED_ID_2_7}" -e "${FEED_ID_3_7}"
这有助于防止误解,以防将特殊字符添加到变量值中。
如果您没有fgrep
尝试grep -F
。