在Unix中将输出重定向到变量时出现问题。
mobileTest.txt
abc.xyx.homepage:https://www.abc.xyz/h-offer/?fromms=1&LNX=KJHYU&oC=ABC
脚本:
#!/bin/bash
TEST_PAGE_KEY="abc.xyx.homepage"
grep -w $TEST_PAGE_KEY mobileTest.txt | cut -d':' -f2-|sed 's/[&/\]/\\&/g'
输出:这是正确的......
https:\/\/www.abc.xyz\/h-offer\/?fromms=1\&LNX=KJHYU\&oC=ABC
相反,在变量中捕获命令的输出时:
TEST_PAGE_VALUE=`grep -w $TEST_PAGE_KEY mobileTest.txt | cut -d':' -f2-|sed 's/[&/\]/\\&/g'`
echo $TEST_PAGE_VALUE
变量输出:
https:&&www.abc.xyz&h-offer&?fromms=1&LNX=KJHYU&oC=ABC
当我将其分配给变量时,我不明白为什么输出不同(而不是添加反斜杠,它会将字符替换为&
)。
答案 0 :(得分:3)
您已找到其中一个原因why the modern $(...)
command-substitution syntax is preferable to legacy syntax `...`
:
使用$(...)
,您无需担心\
个字符。在您的命令中,在命令替换的上下文中具有特殊含义。
因此,使用$(...)
而非`...`
将产生所需的结果:
test_page_value=$(grep -w "$TEST_PAGE_KEY" mobileTest.txt | cut -d':' -f2-|sed 's/[&/\]/\\&/g')
还要注意我是如何为avoid conflicts with environment variables and special shell variables避免使用全大写变量名,以及为了保护我是如何双引号(仍然命名不佳)$TEST_PAGE_KEY
来自潜在的shell扩展。