我有一个 shell 脚本,我想在其中打印定界文档内的日期。下面是代码片段。
echo "This is a text"
echo I want date to print inside heredoc <<EOF
var1=`date`
echo $var1
EOF
echo "Thats All"
上述代码的输出是
I want date to print inside heredoc
Thats All
它不打印日期。即使我输入任何 echo 命令它也不会打印。这里可能出了什么问题。
注意:我尝试在此处的代码中添加以下内容 ___EOF -- 不起作用 'EOF' -- 不起作用
请建议。
这是我的实际代码,当我必须切换到不同的用户,然后在那里执行一些操作时
su - oracle << EOF
echo $(xyz file.prop) > replace.txt
var1=`cat replace.txt_orig`
var2=`cat replace.txt`
echo $var1
echo $var2
EOF
这里变量分配和 echo 不起作用。
答案1
Heredocs 被读取为 STDIN,除非指定了文件描述符,但echo
不从 stdin(或任何 fd)读取。
此外,虽然命令替换和参数扩展将在定界文档内起作用(只要 WORD in<< WORD
未加引号),但变量赋值将不起作用,命令替换之外的命令也不起作用。
我什至不确定你最终想要在这里完成什么,这似乎是一个 XY 问题,但你可以使用cat
它来阅读你的heredoc,它将按预期工作
var1=$(date)
cat <<EOF
$var1
EOF
或者简单地:
cat <<EOF
$(date)
EOF
答案2
xyz
您不需要在此处文档中进行变量分配或命令替换,因为在将命令结果或文件内容生成为输出之前无需将其读取到变量中。
su - oracle <<'END_SU_SCRIPT'
xyz file.prop >replace.txt
cat replace.txt_orig
cat replace.txt
END_SU_SCRIPT
我选择使用此处引用的文档,因为其中没有调用 shell 需要执行的扩展。
您文档中的 shell 扩展内容是您原始此处文档遇到的问题。由于此处文档未加引号,因此调用 shell 将展开其中的所有扩展,就好像它是双引号字符串一样。因此,命令替换$(xyz file.prop)
将被扩展,就像 aroundcat
和 the$var1
和$var2
变量的替换一样,所有这一切都会发生前甚至打电话su
。