我在互联网上看到了很多关于它的帖子,但我无法让它按照我想要的方式运行。
我有来自路径用户的输入。如果用户输入 ~/Desktop/ 例如,由于波浪号,我无法在 grep 和其他命令中使用 $ans 。
这是我的代码的示例。第二行是我现在的主要问题。
read -p "Enter new path or type 'exit': " ans
file=`grep -x $ans ~/.Log`
感谢你的帮助。
答案1
这里有几个问题:
您没有引用您的变量。这意味着用户传入的任何内容都将受到(参数扩展后)空格上的分词和全球扩张。这会破坏事情。看:
用户输入可以以连字符开头。如果是,它将被解释为 的一个选项
grep
。为了避免这种情况,请使用该-e
选项来告诉grep
参数具体是一种搜索模式,无论它看起来是什么样的。您正在使用正则表达式搜索。您可能需要固定文本搜索,而不是正则表达式。所以使用
-F
.反引号已弃用。请改用
$(...)
。另请参阅:
将这些点放在一起,您将得到看起来更像是的代码:
read -p "Enter new path or type 'exit': " ans
file="$(grep -Fxe "$ans" ~/.Log)"
但现在我们遇到了其他问题:
该变量
file
将仅包含确切地无论如何,用户输入的内容。或者它可能什么也不包含。或者它可能包含用户键入内容的多个副本,以换行符分隔。如果我们省略
-F
我添加的标志,那么该变量file
将仅包含用户输入的正则表达式的全行匹配项。这些都不是必然的文件。 您命名该变量的事实
file
表明,您对代码的作用有一些其他期望,而不是它实际上的作用。还有许多与使用相关的潜在问题
read
,这些问题可能对您的脚本无关紧要,但您至少应该意识到它们;看:(虽然那篇文章讨论了使用 shell环形处理文本(您没有这样做),它还用很好的示例解释了使用中涉及的一些怪癖
read
。)file
另外,无论您稍后对该变量执行什么操作,都可能是很多通过管道更简单地完成。
但我无法进一步讨论这个问题,因为我不知道你的剧本的其余部分是什么样的。
答案2
引用包裹搜索变量
file=`grep -x "$ans" ~/.Log`
答案3
看这个问题以及那里的答案。它与 shell 扩展的顺序和引用有关,特别是波形符扩展。对我来说,最简单的方法是我的答案是搜索并替换~
为 的值$HOME
。所以你可以在 grep 之前添加这一行:
ans="${ans//\~/$HOME}"
这是一种 bashism,但它带有 bash 标签。