Bash sed中未终止的's'命令

Bash sed中未终止的's'命令,bash,shell,quoting,Bash,Shell,Quoting,下面的命令在一个简单的bash脚本中用于获取MySQL 5.7中的临时密码 vzctl exec $VEID 'defaultpass=$(cat /var/log/mysqld.log | grep "A temporary password is generated for" | tail -1 | sed -n 's/.*root@localhost: //p')' 但是,当我运行命令进行测试时,它会显示以下内容: sed: -e expression #1, char 19: unte

下面的命令在一个简单的bash脚本中用于获取MySQL 5.7中的临时密码

vzctl exec $VEID 'defaultpass=$(cat /var/log/mysqld.log | grep "A temporary password is generated for" | tail -1 | sed -n 's/.*root@localhost: //p')'
但是,当我运行命令进行测试时,它会显示以下内容:

sed: -e expression #1, char 19: unterminated `s' command
有人能解释一下我到底做错了什么吗。我决不是专家,但我认为这是正确的。我也试着用替换,但没用。然后没有错误,但是$defaultpass返回空


跟进:不幸的是,正如pii_ke所描述的,当我使用双引号时,变量的输出为空/空。所以这不起作用。这里可能还有其他问题?

因为vzctl命令的整个第三个参数都用单引号引起来。您应该将sed命令放在双引号内:

vzctl exec $VEID 'defaultpass=$(cat /var/log/mysqld.log | grep "A temporary password is generated for" | tail -1 | sed -n "s/.*root@localhost: //p")'

因为vzctl命令的整个第三个参数都用单引号引起来。您应该将sed命令放在双引号内:

vzctl exec $VEID 'defaultpass=$(cat /var/log/mysqld.log | grep "A temporary password is generated for" | tail -1 | sed -n "s/.*root@localhost: //p")'

不确定到底是哪个字符导致了这种情况,但是如果您不想引用regex字符,那么您必须使用sed-eq,为什么不将其分离为多个命令,而不是单个复杂的命令?而且不需要在那里使用cat。。只需执行grep“string”filename不确定是哪个字符导致了这种情况,但是如果您不想引用regex字符,那么您必须使用sed-eq,为什么不将其分离为多个命令,而不是单个复杂的命令?而且不需要在那里使用cat。。只要做grep'string'文件名就行了。不管怎样,我错了。调用变量defaultpass时,输出为空。这就是我的意思,我已经用双引号试过了。起初我认为它是有效的,但之前我已经使用过这个变量,所以它仍然记得那个输入。所以如果我用你的例子;使用双引号,我调用变量,输出为空/空…?请尝试类似defaultpass=$vzctl exec$VEID'…'之类的操作。然后它将在当前范围内设置defaultpass。不过,我错了。调用变量defaultpass时,输出为空。这就是我的意思,我已经用双引号试过了。起初我认为它是有效的,但之前我已经使用过这个变量,所以它仍然记得那个输入。所以如果我用你的例子;使用双引号,我调用变量,输出为空/空…?请尝试类似defaultpass=$vzctl exec$VEID'…'之类的操作。然后在当前范围内设置defaultpass。