Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 这个sed shell脚本的功能是什么?_Bash_Shell_Sed - Fatal编程技术网

Bash 这个sed shell脚本的功能是什么?

Bash 这个sed shell脚本的功能是什么?,bash,shell,sed,Bash,Shell,Sed,我读到了关于使用pgpool和Watchdog建立集群的文章,决定尝试一下 我远不是一个精通shell脚本的人,但我可以遵循文档并根据虚拟机的设置进行修改。但我不明白以下片段的目的是什么: if [ ${PGVERSION} -ge 12 ]; then sed -i -e \"\\\$ainclude_if_exists = '$(echo ${RECOVERYCONF} | sed -e 's/\//\\\//g')'\" \ -e \&qu

我读到了关于使用pgpool和Watchdog建立集群的文章,决定尝试一下

我远不是一个精通shell脚本的人,但我可以遵循文档并根据虚拟机的设置进行修改。但我不明白以下片段的目的是什么:

if [ ${PGVERSION} -ge 12 ]; then
    sed -i -e \"\\\$ainclude_if_exists = '$(echo ${RECOVERYCONF} | sed -e 's/\//\\\//g')'\" \
           -e \"/^include_if_exists = '$(echo ${RECOVERYCONF} | sed -e 's/\//\\\//g')'/d\" ${DEST_NODE_PGDATA}/postgresql.conf
fi
在我的例子中,PGVERSION将是
12
(因此脚本将在条件之后执行代码),RECOVERYCONF是
/usr/local/pgsql/data/myrecovery.conf
,DEST_NODE_PGDATA是
/usr/local/pgsql/data

我得到(如果我错了,请原谅并纠正我的错误)–e表示接下来是脚本,$(某些命令)部分计算表达式并返回结果,sed正则表达式表示“/”将被\/(正斜杠和斜杠)替换。让我困惑的是
“\\$ainclude\u if\u exists=“
”/^include\u if\u exists”
部分,我不知道它们是什么意思或它们的用途,也不知道它们是如何相互作用的。而且,第一个sed正则表达式后面的-e让我感到困惑

如果您对上下文感兴趣,那么这些命令就在
/var/lib/pgsql/11/data/recovery\u 1st\u stage
示例脚本的末尾


提前感谢您的时间。

下面是相同代码的一个小表示:

sed -i -e '$amyvalue = foo' -e '/^myvalue = foo/d' myfile.txt
第一个sed表达式是:

$                  # On the last line        
 a                 # Append the following text
  myvalue = foo    # (text to be appended)
二是:

/                  # On lines matching regex..
 ^myvalue = foo    # (regex to match)
               /   # (end of regex)
                d  # ..delete the line
因此,它删除任何可能已经存在的
myvalue=foo
,然后在末尾添加一行。关键是要确保只有一行,方法是:A.如果缺少行,则添加该行;B.如果行已经存在,则不要复制该行


表达式的其余部分只是因为以下事实而变得复杂:该代码段使用变量,并嵌入在一个双引号字符串中,该字符串通过
ssh
传递到另一个主机,因此需要对变量和引号进行一些额外的转义。

1)您可以只比较$
{DEST\u NODE\u PGDATA}/postgresql.conf
在运行此命令之前和之后(因此
cp${DEST_NODE_PGDATA}/postgresql.conf{DEST_NODE_PGDATA}/postgresql.conf.bak
然后
diff${DEST_NODE_PGDATA}/postgresql.conf*
..“请解释此代码”通常不考虑关于此主题的问题。请参见第2页)您可以通过查看带有调试选项集的流来进一步深入研究,即
set-x
(甚至
set-vx
set+x
set+vx
)将其打开。3)您可以“深入”并“分解”每个语句到其组件部分,如“什么是
echo${RECOVERYCONF}”| sed-e的//\//\\//g'
作为输出产生,输入什么,产生什么,等等?祝你好运!@shelleter感谢你的建议,这帮助我了解了脚本的作用。@Charles Duffy Sorrry,如果我违反了规则的话。我花了几个小时,找不到任何解释。我试图将问题缩小到部分这是我最感兴趣的。我一直在尝试复制它。在我的例子中,它将是
gsed-i-e\“$aincludefexists=$(echo'/usr/local/bin/pqsql/''gsed'/\//\\//\\//\\//\\//\\//g')”-e\“//^include\u if\u存在='$(echo'/usr/local bin/pqsql/'gsed'/\//\\\//\\\//g')/d\“myfile.txt
忘了说我在FreeBSD下工作,所以我总是指定要使用GNU。我仍然在
-e unknown命令中遇到错误“
对不起,如果我遗漏了什么对不起,关于另一条评论,我只是注意到了这一点,不想打扰您,但我想已经太晚了:C代码段的语法本身无效,因为它嵌入了前面提到的双引号字符串中。如果你想独立运行它,你需要取消转义:
sed-i-e“\$ainclude\u if\u exists='$(echo'/usr/local/bin/pqsql/'\124; sed's/\//\\//\\//\\//g')”-e“/^include\u if\u exists='$(echo'/usr/local/bin/pqsql/''sed's/\//\\\\//\\\//g')”/d“myfile.txt现在我明白了!我被所有的逃跑都搞砸了。如果我猜sed部分是为了添加必要的scape,以便能够毫无问题地将其写入另一台机器中的文件,那么我是正确的?将问题标记为已解决。谢谢你的帮助,你太棒了!基本上,是的。您可以看到
sed-i“s/*/hello world/”file.txt是一个有效的命令,但是
ssh localhost“sed-i”s/*/hello world/”file.txt“
失败。相反地,
ssh localhost“sed-i\”s/*/hello world/\“file.txt”
可以工作,但仅在没有上下文(
sed-i\”s/*/hello world/\“file.txt
)的情况下复制命令失败