bash - 使用带引号的字符串的 bash set 命令
问题描述
我正在尝试解析一系列包含混合值和字符串的输出行。我认为该set
命令将是一种直接的方法。
初步测试似乎很有希望。这是一个示例命令行及其输出:
$ (set "one two" three; echo $1; echo $2; echo $3)
one two
three
显然,我得到了两个变量的回显,而第三个变量则没有。
然而,当我把它放在我read
用来捕获输出行的脚本中时,我得到了一种不同的解析:
echo \"one two\" three |
while read Line
do
echo $Line
set $Line
echo $1
echo $2
echo $3
done
这是输出:
"one two" three
"one
two"
three
该echo $Line
命令显示引号存在,但该set
命令不使用它们来分隔参数。为什么不?
在研究 and 的用法时read
,while read
我遇到了这个while IFS= read
成语,所以我尝试了一下,但它根本没有任何区别。
我已经阅读了几十个关于引用的问题,但没有找到任何可以为我澄清这一点的东西。显然我的引用水平很混乱,但是在哪里呢?我可以做些什么来获得我想要的东西,即在我的脚本中获得与从命令行获得的相同类型的解析?
谢谢。
解决方案
read
不解释引号,它只是"one
作为一个标记读取,two"
作为另一个标记。(想想如果 shell 会评估来自随机位置的输入,事情可能会出错的所有方式。Python 2 的教训及其缺陷input()
也是一个很好的例子。)
如果您真的想评估事物,eval
那就去做吧;但它伴随着一大堆警告,如果不小心,往往会导致安全问题。
根据您想要完成的任务,也许可以在单独的行上提供输入?或者,如果这些是用户提供的参数,只需将它们保存在"$@"
. 还要注意如何将它们的一个子集传递给一个函数,"$@"
如果你想弄乱它,它会获得自己的本地。
(切线地,您不将参数引用到echo
. 请参阅何时在 shell 变量周围加上引号。)
推荐阅读
- python - 无法从 Powershell 或 VS 代码运行 .py 文件
- dialogflow-es - IAM Permision Denied - 对话流 Gcloud Twilio 集成
- python - 将二进制 PNG 掩码转换为“标签指示矩阵”格式以使用 sklearn.metrics f1_score(二进制)进行评估
- .net - 向 https 发出 HTTP 请求时出错
- python - 需要一个正则表达式来获得不同的输出
- bash - 源 Azure 服务主体 yaml
- json - 如何在 Scala 中使用 Circe 将嵌套的 json 解码为 List[Object]
- list - 从 firestore 中的文档查询集合创建列表
- vba - 如何仅提取最新或今天的附件
- redirect - codeigniter 4 url 链接到外部网页,如何使用控制器完成?