Bash 脚本:将变量传递给包含引号、单引号的 bash 脚本。等等

use*_*685 1 shell bash quoting arguments variable

让我们假设这是字符串:

   'a',"b"
Run Code Online (Sandbox Code Playgroud)

它包含单引号和双引号。

您将如何将其作为单个字符串传递给 bash 脚本?

这是 bash 脚本:

#!/bin/bash
echo $1
Run Code Online (Sandbox Code Playgroud)

它必须回声

'a',"b"
Run Code Online (Sandbox Code Playgroud)

但我们不能假设字符串这么小。最终我计划发送整个

 /etc/httpd/conf/httpd.conf
Run Code Online (Sandbox Code Playgroud)

作为此 bash 脚本的字符串。

所以我不能一次转义引号和单引号。

Mic*_*mer 5

您可以使用命令替换

oo.sh "$(cat /etc/httpd/conf/httpd.conf)"
Run Code Online (Sandbox Code Playgroud)

这将运行cat /etc/httpd/conf/httpd.conf并将输出(文件的内容)放入给定的第一个参数中oo.sh。它被引用,所以它作为单个参数传递——空格和特殊字符被原封不动地传递。oo.sh得到一个参数。


不过,更广泛地说,如果可能,最好将文件名传递到脚本中,或者将文件内容作为标准输入 ( oo.sh < /etc/httpd/conf/httpd.conf) 提供。除了更标准之外,所有命令行参数的最大长度都可以是最大长度,并且文件可能比这更长。即使它现在可以工作,如果该文件可能会随着时间的推移变得更大,最终将整个内容作为参数传递将停止工作,并出现错误“arg list too long”。

您可以使用 找到该限制getconf ARG_MAX。大小变化很大:我这里的系统有 2MB 限制和 256KB 限制。如果您的文件总是很小,您不必担心,否则您应该尝试另一种将数据放入脚本的方法。