标签: here-document

bash脚本中的“意外的文件结尾”

如果在 bash 脚本中,我有这个:

if [ $ACTION = deploy ]; then
    ${JAVA_HOME}/bin/java ${JVM_ARGS} weblogic.WLST << EOJ
    connect('XXX','XXX','t3://XXX:8001')
    jndi();
    ls();
    disconnect();
    exit ();
    EOJ
else
    echo "XXX"
fi
Run Code Online (Sandbox Code Playgroud)

我认为错误出在 EOJ 中。

bash shell-script here-document

5
推荐指数
1
解决办法
3472
查看次数

使用bash脚本输出新脚本:需要替换和不替换变量的混合

我在使用 bash 变量替换时遇到问题。这是我正在尝试做的一个愚蠢的例子。我需要从 bash 脚本输出一个新脚本。一行(参见echo我的示例)混合了不应替换的变量和应替换的变量。

#!/bin/bash
REPLACE=`whoami`
cat << EOF > mynewscript.sh
    read DONTREPLACE < /home/$REPLACE/localinput.txt
    echo $DONTREPLACE > /home/$REPLACE/somefile.log
EOF
exit 0
Run Code Online (Sandbox Code Playgroud)

这不是一个真实的例子,但它确实说明了问题。假设我需要提前知道绝对路径,并且我希望在我的原始脚本中评估 $REPLACE。但我不希望在我的脚本中评估/替换 $DONTREPLACE。$DONTREPLACE应该完全像新脚本一样输出。

因此,在制作 here 文档时引用“EOF”是行不通的。

我希望我能很好地解释这一点。

我不知道其他解决方案。我欣赏任何想法,但我更喜欢非常简单的想法/解决方案。它不必很优雅。

bash echo variable-substitution here-document

5
推荐指数
1
解决办法
6586
查看次数

“cat”命令:如何自动转义所有可能违规的内容?

如果复制内容

httpd.conf
Run Code Online (Sandbox Code Playgroud)

然后将其粘贴到 cat 命令中.. 比如这个..

#!/bin/bash
cat > /test << EOF
pasted here..
EOF
Run Code Online (Sandbox Code Playgroud)

你遇到这个错误:

-bash: command substitution: line 1: unexpected EOF while looking for matching `''
-bash: command substitution: line 4: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

也许解决方案是逃避美元符号,甚至可能是引号等等。

但考虑到这是一个如此大的文件..可以自动转义美元符号吗?

我唯一的选择是通过另一个程序将它们转义,然后将其提供给 cat 命令吗?

command-line shell quoting cat here-document

5
推荐指数
2
解决办法
1万
查看次数

4
推荐指数
1
解决办法
2万
查看次数

为什么将 HEREDOC 作为字符串传递给 `ruby -e` 不起作用?

由于我不明白的原因,似乎不可能将 heredoc 作为表达式传递给 Ruby 解释器:

$ ruby -e <<END
heredoc> puts 'hi'
heredoc> END

ruby: no code specified for -e (RuntimeError)
Run Code Online (Sandbox Code Playgroud)

同样的事情也发生在 Perl 上,这让我们很痛苦地发现它与 Ruby 无关。

$ perl -e<<END
heredoc> print 'hi'
heredoc> END
No code specified for -e.
Run Code Online (Sandbox Code Playgroud)

甚至sed

$ echo "blah" | sed -e <<END
pipe heredoc> s/.*/Hi/
pipe heredoc> END
sed: option requires an argument -- e
usage: sed script [-Ealn] [-i extension] [file ...]
       sed [-Ealn] [-i extension] [-e script] ... [-f script_file] ... …
Run Code Online (Sandbox Code Playgroud)

quoting ruby here-document

4
推荐指数
1
解决办法
2485
查看次数

cat &gt; file &lt;&lt; "END" 如何工作?

$ cat > file << "END"
> asdf
> qwerty
> END
$ cat file
asdf
qwerty
$
Run Code Online (Sandbox Code Playgroud)

不知道上面的技巧是如何工作的。

cat > file对我来说有点可以理解,这意味着 的输出cat正在被重定向并写入file.

<< "END"部分是如何工作的?我至少假设这意味着字符串END应该被视为输入cat- 因此,如果有的话,我假设最后file应该只包含一行三个字母:END. 这意味着“接受来自控制台的输入并将其重定向到,cat直到用户输入这个字符串,这应该被视为分隔符”是我无法理解的。

shell io-redirection cat here-document

4
推荐指数
1
解决办法
1万
查看次数

通过附加到当前 tty 的 su 运行heredoc脚本

我正在尝试做这样的事情:

sudo su <<EOF
select x in a b c; do echo "Selected $x"; break; done
EOF
Run Code Online (Sandbox Code Playgroud)

但是,它会终止而不接受输入。

如果我这样做,它会起作用:

sudo su -c 'select x in a b c; do echo $x; break; done'
Run Code Online (Sandbox Code Playgroud)

但用heredoc编写更长的脚本会更好(是的,我知道将它们放在文件中更好)。

我确信这个问题在各个地方都有答案,但我似乎无法找到正确的 bash/heredoc/tty/stdin 搜索词组合。

有什么办法可以实现这一点吗?

su tty stdin here-document

4
推荐指数
1
解决办法
2404
查看次数

如何转义定界符 bash 脚本中的字符

我有一个 bash 脚本,它读取输入文件并使用heredoc使用expect ssh到服务器,但在转义输入文件中的某些特殊字符时遇到问题。这是我所拥有的..


我有一个名为 input.txt 的文件,其中包含:

1.2.3.4:abcdefg
2.3.4.5:abc$def
Run Code Online (Sandbox Code Playgroud)

我有一个 bash 脚本,如下所示。如果密码不包含字符“$”,它工作正常,但当密码包含“$”时,它会崩溃,因为它将 $ 后面的部分视为变量。

#!/bin/bash

if [ -e "input.txt" ]; then
    while read i; do

/usr/bin/expect <(cat << EOD
set timeout 15
spawn ssh "user@$(echo $i | cut -d: -f 1)"
#######################

expect "yes/no" {
    send "yes\r"
    expect "Password:" { send "$(echo $i | cut -d: -f 2)\r" }
} "Password:" { send "$(echo $i | cut -d: -f 2)\r" }
expect -re "day: $" { send "\r" }
expect …
Run Code Online (Sandbox Code Playgroud)

bash special-characters expect here-document

4
推荐指数
1
解决办法
4808
查看次数

dc 和标准输入或带字符串命令的heredoc?

dc可以从文件或/和标准输入中读取命令。
如果我想打印用户输入:

cat essai_dc
[enter a number : ]
n
?
p

dc essai_dc 
  enter a number : 4
  4
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试使用heredoc

dc <<EOF
> [enter a number : ]
> n
> ?
> p
> EOF  

enter a number : dc: stack empty
Run Code Online (Sandbox Code Playgroud)

我对标准输入也一样:

cat essai_dc | dc
enter a number : dc: stack empty
Run Code Online (Sandbox Code Playgroud)

命令 ?获取p并执行它,但堆栈为空。
是否有可能让它工作(告诉dc等待输入)

shell here-document dc

4
推荐指数
1
解决办法
73
查看次数

sed:用标准输入替换多行块

给出的input_file

1
2
START
foo
END
3
Run Code Online (Sandbox Code Playgroud)

目标START是将 include ...块内的内容替换END为来自标准输入的多行内容:

1
2
hello 
world
3
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

sed '/^START$/,/^END$/d;r /dev/stdin' input_file <<EOF 
hello
world
EOF
Run Code Online (Sandbox Code Playgroud)

不幸的是导致

1
hello
world
2
3
Run Code Online (Sandbox Code Playgroud)

我猜想是在第一行之后r /dev/stdin按顺序调用的,并且只是在第一行之后附加。 /^START$/,/^END$/d;

第二次尝试:

sed '/^START$/,/^END$/{d;r /dev/stdin
}' input_file <<EOF     
hello
world
EOF
Run Code Online (Sandbox Code Playgroud)

印刷

1
2
3
Run Code Online (Sandbox Code Playgroud)

为什么上述命令(尤其是最后一个命令)会打印错误的结果?我该如何调整这些?

sed text-processing stdin here-document

4
推荐指数
1
解决办法
1631
查看次数