首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将bash set命令与带引号的字符串一起使用

将bash set命令与带引号的字符串一起使用
EN

Stack Overflow用户
提问于 2020-10-30 16:31:30
回答 2查看 47关注 0票数 0

我正在尝试解析一系列包含值和字符串的输出行。我认为set命令是完成此任务的一种简单方法。

最初的测试似乎很有希望。下面是一个命令行示例及其输出:

代码语言:javascript
运行
复制
$ (set "one two" three; echo $1; echo $2; echo $3)
one two
three

显然,我得到了两个变量的回显,而第三个变量则没有。

但是,当我把它放到我的脚本中时,我使用read来捕获输出行,我得到了一种不同的解析:

代码语言:javascript
运行
复制
echo \"one two\" three |
while read Line
do
    echo $Line
    set $Line
    echo $1
    echo $2
    echo $3
done

下面是输出:

代码语言:javascript
运行
复制
"one two" three
"one
two"
three

echo $Line命令显示存在引号,但是set命令不使用引号来分隔参数。为什么不行?

在研究readwhile read的用法时,我遇到了while IFS= read成语,所以我尝试了一下,但没有任何区别。

我已经通读了几十个关于引用的问题,但没有找到任何可以为我澄清这一点的东西。显然,我把我的引用级别搞糊涂了,但是在哪里呢?我应该怎么做才能得到我想要的东西,即在我的脚本中获得与我从命令行获得的相同类型的解析?

谢谢。

EN

Stack Overflow用户

发布于 2020-10-30 17:06:24

有何不可?

readIFS中的每个字符进行输入拆分。对于未设置或默认的IFS,则为空格、制表符或换行符。任何其他字符都没有任何特殊之处,引号也没有任何特殊之处。

很明显,我把我的报价级别搞混了,但是在哪里呢?

你错误地认为read足够聪明,可以解释引号。事实并非如此。而且,read忽略了\序列。请阅读how to read a stream line by linebash manual word splitting

我该怎么做才能得到我想要的东西,即在我的脚本中获得与我从命令行获得的相同类型的解析?

要获得与从命令行获得的相同的解析,可以使用evaleval是邪恶的。Eval command and security issues

代码语言:javascript
运行
复制
echo \"one two\" three |
while IFS= read -r line; do
      eval "set $line"  # SUPER VERY UNSAFE DO NOT USE
      printf "%s\n" "$@"
done

当使用eval时,恶意用户可能会立即echo '"$(rm -rf *)"' | ...删除您的文件。shell中最简单的解决方案是使用xargs,它(大部分令人困惑的)在解析输入时包含了引号解析。

代码语言:javascript
运行
复制
echo \"one two\" three | xargs -n1 echo
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64604964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档