如何在命令中逐字包含 echo?

How to literally include echo in a command?

在我的脚本中有:

#!/bin/bash

# Take sudo password from the first argument if present
SUDO="sudo -u postgres"
if [ "" != "" ]; then
    SUDO="echo  | sudo -S -u postgres"
fi

${SUDO} psql -c "create database foo;"

... several other similar commands here ...

当我 运行 带有 myPassword 的脚本时,我得到:

myPassword | sudo -S -u postgres psql -c create database foo;

所以它只是呼应了这条线。显然我想要的是 运行 该命令,但是 </code> 得到扩展:</p> <p><code>$ echo myPassword | sudo -S -u postgres psql -c create database foo;

我该怎么做?

管道 |、重定向 < 和类似的东西在您 运行 通过扩展变量来执行命令时不会被 shell 解释。只有单词被拆分并且 globs (*, ?, []) 被扩展。 示例:

$ v='echo a | cat'
$ $v
a | cat > b

要解释它们,您可以使用 eval

$ v='echo a | cat'
$ eval "$v"
a

但是,这是不受欢迎的,因为您经常会遇到引用问题。通常,有更好的方法来解决特定问题。

作为一种更简洁的解决方案,您可以将管道包装在一个函数中:

#!/bin/bash

# Take sudo password from the first argument if present
SUDO="sudo -u postgres"
if [ "" != "" ]; then
    pw=""
    sudoWithPw() { echo "$pw" | sudo -S -u postgres "$@"; }
    SUDO="sudoWithPw"
fi

${SUDO} psql -c "create database foo;"

一个更好的解决方案是仅以用户 postgres 身份登录一次,而不是在每个命令前加上前缀 ${SUDO}。您可以使用 susudo bash -c aFunctionYouExportedEarlier.