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 脚本的字符串。
所以我不能一次转义引号和单引号。
您可以使用命令替换:
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 限制。如果您的文件总是很小,您不必担心,否则您应该尝试另一种将数据放入脚本的方法。