我的 shell 脚本中有以下代码片段,并且有一个错误,尽管进行了一些研究,但我似乎无法确定原因。当我运行如下代码时,脚本退出并显示一条消息
./my_script.sh: line 53: syntax error at line 61: `<<' unmatched
Run Code Online (Sandbox Code Playgroud)
我已经使用过set -x并且可以看到在出现错误之前一切都很好(无论如何我只设置了变量)。出于某种原因,只需从eot允许它工作之前删除空格(它们是空格而不是非显示字符)。它让我的 xml 看起来有点不对齐但功能正常。有谁知道为什么会发生这种情况,因为我不喜欢这样的事情,我无法解释,我希望我的 xml 看起来也很漂亮。
这是脚本的相关部分:
# ... various environment variables set here ...
clean_files() # line 53
{
# Clear up the intermediate files
mv $datafile $ARCHIVE_DIR/$(basename $datafile).$$
}
xmlfile_header()
{ # line 60
cat <<- eot
<?xml version="1.0" encoding="UTF-8" ?>
<ppllist>
eot
}
# ... more stuff ...
Run Code Online (Sandbox Code Playgroud) 基本上我想检查前后相同文件的差异 sed
试图运行:
diff /opt/postTrades.sh <<< $(sed 's/1\ MIN/10\ MIN/g' /opt/postTrades.sh)
Run Code Online (Sandbox Code Playgroud)
和
diff <<< $(sed 's/1\ MIN/10\ MIN/g' /opt/postTrades.sh) < /opt/postTrades.sh
Run Code Online (Sandbox Code Playgroud)
和
diff <<< (sed 's/1\ MIN/10\ MIN/g' /opt/postTrades.sh) < /opt/postTrades.sh
Run Code Online (Sandbox Code Playgroud)
总是得到:
diff: missing operand after '/opt/postTrades.sh'
diff: Try 'diff --help' for more information.
Run Code Online (Sandbox Code Playgroud)
正确的做法是什么?谢谢。
我有一个应用程序,它要求生产者将文件名发送给消费者,并让生产者在发送最后一个文件名并到达文件末尾时向消费者指示。
为简单起见,在以下示例中, 使用和演示生产者,而使用 演示消费者。我试图推断“此处文件”方法但没有成功,用于向生产者包装器(如果存在此类东西)指示要查找的内容作为文件结尾的指示。如果它工作应该从输出中过滤。echoprintfcat<<EOFcatEOF
例 1)
输入
{
echo "Hello World!"
printf '\x04'
echo "EOF"
} <<EOF |\
cat
Run Code Online (Sandbox Code Playgroud)
输出
bash: warning: here-document at line 146 delimited by end-of-file (wanted `EOF')
Hello World!
EOF
Run Code Online (Sandbox Code Playgroud)
例 2)
输入
{
echo "Hello World!"
printf '\x04'
echo "EOF"
} |\
cat <<EOF
Run Code Online (Sandbox Code Playgroud)
输出
bash: warning: here-document at line 153 delimited by …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 bash 中修补这样的文件:
cat << ''EOF | patch --dry-run
> --- urancid 2017-12-06 09:56:33.000000000 -0600 patch --dry-run
> +++ /tmp/urancid 2017-12-06 15:06:57.000000000 -0600
> @@ -393,7 +393,7 @@
> last if (/^$prompt/);
> next if (/-ac\.\s*/);
> next if (/-fs\.\s*/);
> - next if (/set date\s*/)
> + next if (/set date\s*/);
> next if (/^(\s*|\s*$cmd\s*)$/);
> if ( ! /^$prompt/) {
> if ( ! $skipprocess ) {
> EOF
Run Code Online (Sandbox Code Playgroud)
但我得到的只是
patching file urancid
Hunk #1 FAILED at 393. …Run Code Online (Sandbox Code Playgroud) 我有这个:
cat <<EOF
'use strict';
exports.default = {
'display names': {}
}
EOF > "$PWD/tmp.js"
Run Code Online (Sandbox Code Playgroud)
但这显然在语法上是错误的,有人知道这样做的语法吗?
我正在做一个脚本来自动安装一些东西,包括一个 nginx web 服务器。
我正在创建这样的 nginx conf 文件:
cat >/etc/nginx/sites-available/bookstack.conf <<EOL
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl_certificate /etc/nginx/certificats/domain.tld.crt;
ssl_certificate_key /etc/nginx/certificats/domain.tld.key;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
server_name domain.tld;
root /path/to/bookstack/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_index index.php;
try_files $uri =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
}
}
server {
listen 80;
listen [::]:80;
server_name domain.tld;
return 302 https://$server_name$request_uri;
}
EOL
Run Code Online (Sandbox Code Playgroud)
我的问题是 cat 将 $ 字符作为变量名(这通常是有意义的)并且没有将我想要的内容放入我的.conf文件中。这是脚本完成工作后我的 …
我有以下命令,但它对我不起作用...
cd /etc/postfix/ssl/ && openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024 <<PASS
password
password
PASS
Run Code Online (Sandbox Code Playgroud)
输出是:
109 semi-random bytes loaded
Generating RSA private key, 1024 bit long modulus
...............................++++++
...........++++++
e is 65537 (0x10001)
Enter pass phrase for smtpd.key:
Run Code Online (Sandbox Code Playgroud)
它应该自动回答问题并自动输入密码。
我总是HEREDOC用于在 bash 上自动化我的问答并且工作正常......
这里有什么问题?
可能是因为安全问题,但是我们如何处理这样的问题呢?
我也知道这个问题,但无法解决。
我正在尝试这个:(没有结果)
#!/bin/bash
PASS="password"
printf '%s\n' "$PASS" | {
openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024 -passout fd:3
} 3<&0
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
awk 是否可以从标准输入读取程序和输入?
我希望能够将文件通过管道传输到以下函数。
process_data () {
awk -f - <<EOF
{print}
EOF
}
Run Code Online (Sandbox Code Playgroud)
注意:实际程序较长,不能作为命令行参数传递,我宁愿不使用临时文件。
目前它不输出任何东西。
$ yes | head | process_data
$
Run Code Online (Sandbox Code Playgroud) 我想将变量从源发送到主机,然后执行主机脚本。这是我的代码:
var1=1
ssh -p 42 root@xxx /bin/bash << EOF
var2=2
echo $var1
echo $var2
EOF
Run Code Online (Sandbox Code Playgroud)
返回 : 1
var1=1
ssh -p 42 root@xxx /bin/bash << \EOF
var2=2
echo $var1
echo $var2
EOF
Run Code Online (Sandbox Code Playgroud)
返回 : 2
如何返回:
1
2
Run Code Online (Sandbox Code Playgroud)
?
我正在尝试在远程服务器上执行脚本,并将脚本作为最后一个参数传递
ntrs exec-all-ubuntu --exec `cat << 'EOF'
echo "$(pwd)"
echo "$foobar"
EOF`
Run Code Online (Sandbox Code Playgroud)
问题是文本中的值作为单独的参数发送,echo 是第一个参数,pwd 值是第二个单独的参数,但我只想要一个参数作为字符串
参数最终看起来像这样:
[ '--exec', 'echo', '"$(pwd)"', 'echo', '"$foobar"' ]
Run Code Online (Sandbox Code Playgroud)
但我正在寻找带有换行符的字面内容:
[ '--exec', ' echo "$(pwd)"\n\n echo "$foobar"\n ' ]
Run Code Online (Sandbox Code Playgroud)
我也尝试使用这个:
ntrs exec-all-ubuntu --exec `read -d << EOF
select c1, c2 from foo
where c1='something'
EOF`
Run Code Online (Sandbox Code Playgroud)
但该字符串是空的
here-document ×10
bash ×4
shell ×3
shell-script ×3
cat ×2
here-string ×2
variable ×2
awk ×1
diff ×1
ksh ×1
linux ×1
patch ×1
pipe ×1
quoting ×1
ssh ×1
whitespace ×1