Macos can';t将参数从shell传递给grep

Macos can';t将参数从shell传递给grep,macos,grep,zsh,Macos,Grep,Zsh,我正在尝试从shell运行一个复杂的grep命令(目前在MacOS上使用zsh,但bash可以) 我想将变量,即$1和$2传递给命令:grep-e'something$1'-e'somethingelse$2'文件 例如,我的脚本: #/bin/zsh echo ------ echo grep -e "'"something $1"'" -e "'"somethingelse $2"'" file echo ---

我正在尝试从shell运行一个复杂的grep命令(目前在MacOS上使用zsh,但bash可以)

我想将变量,即$1和$2传递给命令:grep-e'something$1'-e'somethingelse$2'文件

例如,我的脚本:

#/bin/zsh
echo ------
echo grep -e "'"something $1"'" -e "'"somethingelse $2"'" file
echo ------
grep -e "'"something $1"'" -e "'"somethingelse $2"'" file
这不适用于:

% ~/scripts/test cat mouse
------
grep -e 'something cat' -e 'somethingelse mouse' file
------
grep: cat': No such file or directory
grep: mouse': No such file or directory

有什么想法吗?

运行命令时不要尝试添加单引号;只需在模式(包括参数)周围加上双引号:

请注意,当
echo
ing它时,我在双引号中使用了单引号。它们会被打印出来,所以看起来没问题,但shell不会将它们视为具有语法意义的。当实际运行
grep
时,您根本不需要单引号

嗯,除非
某物
包含转义符或美元符号;在这种情况下,您可以选择以下两种方式:

grep -e "\$ometh\\ng $1" -e "\$ometh\\nge\\se $2" file
或者混合使用单引号和双引号,在固定图案部分使用单引号,在参数部分使用双引号:

grep -e '$ometh\ng '"$1" -e '$ometh\nge\se '"$2" file

运行命令时不要尝试添加单引号;只需在模式(包括参数)周围加上双引号:

请注意,当
echo
ing它时,我在双引号中使用了单引号。它们会被打印出来,所以看起来没问题,但shell不会将它们视为具有语法意义的。当实际运行
grep
时,您根本不需要单引号

嗯,除非
某物
包含转义符或美元符号;在这种情况下,您可以选择以下两种方式:

grep -e "\$ometh\\ng $1" -e "\$ometh\\nge\\se $2" file
或者混合使用单引号和双引号,在固定图案部分使用单引号,在参数部分使用双引号:

grep -e '$ometh\ng '"$1" -e '$ometh\nge\se '"$2" file

我不知道你为什么要
grep
查看你的报价。假设您的文字字符串某物不包含空格或其他对shell很重要的字符(最显著的文件名扩展通配符),并且您使用的是zsh

grep something$1 FILE
会有用的。当然,如果你的东西里面或周围有空格,你需要引用它:

grep 'something '$1 FILE # Significant space between something and $1


因为您还提到了bash:在bash中,只有最后一种形式(使用双引号)才有意义,因为如果$1包含空格,bash将进行分词。

我不知道您为什么希望
grep
查看您的引号。假设您的文字字符串某物不包含空格或其他对shell很重要的字符(最显著的文件名扩展通配符),并且您使用的是zsh

grep something$1 FILE
会有用的。当然,如果你的东西里面或周围有空格,你需要引用它:

grep 'something '$1 FILE # Significant space between something and $1


因为您还提到了bash:在bash中,只有最后一种形式(使用双引号)才有意义,因为如果$1包含空格,bash将进行分词。

我正在尝试运行一个复杂的grep命令
-任何事情都不是一个好的开始:-)!您正在尝试grep以获取regexp或字符串吗?您想进行部分或完整的行匹配吗?@EdMorton:根据使用的选项,OP似乎想要使用简单的regexp。@user1934428 OP正在做的事情和他们想要做的事情之间通常有很大的区别。
我正在试着运行一个复杂的grep命令
-任何事情都不是一个好的开始:-)!您正在尝试grep以获取regexp或字符串吗?您想进行部分或完整的行匹配吗?@EdMorton:根据使用的选项,OP似乎想要使用简单的regexp。@user1934428 OP正在做的事情和他们想要做的事情之间通常有很大的区别。