在用户的变量中使用波形符

在用户的变量中使用波形符

我在互联网上看到了很多关于它的帖子,但我无法让它按照我想要的方式运行。

我有来自路径用户的输入。如果用户输入 ~/Desktop/ 例如,由于波浪号,我无法在 grep 和其他命令中使用 $ans 。

这是我的代码的示例。第二行是我现在的主要问题。

read -p "Enter new path or type 'exit':   " ans
file=`grep -x $ans ~/.Log` 

感谢你的帮助。

答案1

这里有几个问题:

  1. 您没有引用您的变量。这意味着用户传入的任何内容都将受到(参数扩展后)空格上的分词全球扩张。这会破坏事情。看:

  2. 用户输入可以以连字符开头。如果是,它将被解释为 的一个选项grep。为了避免这种情况,请使用该-e选项来告诉grep参数具体是一种搜索模式,无论它看起来是什么样的。

  3. 您正在使用正则表达式搜索。您可能需要固定文本搜索,而不是正则表达式。所以使用-F.

  4. 反引号已弃用。请改用$(...)。另请参阅:


将这些点放在一起,您将得到看起来更像是的代码:

read -p "Enter new path or type 'exit':   " ans
file="$(grep -Fxe "$ans" ~/.Log)"

但现在我们遇到了其他问题:

  1. 该变量file将仅包含确切地无论如何,用户输入的内容。或者它可能什么也不包含。或者它可能包含用户键入内容的多个副本,以换行符分隔。

    如果我们省略-F我添加的标志,那么该变量file将仅包含用户输入的正则表达式的全行匹配项。

    这些都不是必然的文件。 您命名该变量的事实file表明,您对代码的作用有一些其他期望,而不是它实际上的作用。

  2. 还有许多与使用相关的潜在问题read,这些问题可能对您的脚本无关紧要,但您至少应该意识到它们;看:

    (虽然那篇文章讨论了使用 shell环形处理文本(您没有这样做),它还用很好的示例解释了使用中涉及的一些怪癖read。)

  3. file另外,无论您稍后对该变量执行什么操作,都可能是很多通过管道更简单地完成。

但我无法进一步讨论这个问题,因为我不知道你的剧本的其余部分是什么样的。

答案2

引用包裹搜索变量

file=`grep -x "$ans" ~/.Log`

答案3

这个问题以及那里的答案。它与 shell 扩展的顺序和引用有关,特别是波形符扩展。对我来说,最简单的方法是我的答案是搜索并替换~为 的值$HOME。所以你可以在 grep 之前添加这一行:

ans="${ans//\~/$HOME}"

这是一种 bashism,但它带有 bash 标签。

相关内容