这在人脑中有效,但 shell 忽略了引用:
for h in a b; do ssh $h psql -tAc "select * from mytab where mycol='x'"; done
如何在不失去可读性的情况下引用这一行?
答案1
您需要转义引号。将它们视为传递包裹游戏中的层层包裹。每个外壳都会打开一个“层”。
所以:
echo "this ; is a semicolon"
但如果你想通过 ssh 运行它:
ssh $user@$host echo "this ; is a semicolon"
这SSH将打开包裹的第一层 - 发送:
echo this ; is a semicolon
这会破坏,因为分号是由 shell 解释的。
因此,要做到这一点,您需要首先转义引号 - 这样 ssh 才能安全地“解开”一层:
ssh $user@$host echo "\"this ; is a semicolon\""
因此,ssh 将剥离“外层”和“转义层”并通过:
echo "this ; is a semicolon"
这将是您需要为您的一个班轮做的事情。至于不失去可读性 - 恐怕说起来容易做起来难,因为转义和引用嵌套不可避免地会变得混乱。
我能提供的最好的办法是使用一个变量来封装你的 SQL 语句,这样至少可以清楚地知道你正在发送一个“封装的语句”:
THING_TO_ECHO='"this ; is a semicolon"'; ssh $user@host echo $THING_TO_ECHO