grep的内部shell脚本不工作

问题描述:

当我在命令行它的工作原理上运行此:grep的内部shell脚本不工作

ls | grep -v "#$" 

但是当我做ls | scriptname和脚本里面我有:

#fileformat=unix 
#!/bin/bash 
grep -iv '#$' 

它不工作。为什么?

[编辑]

用于第一线的原因进行说明here

除此之外,即使我删除前两行它应该工作。我在远程Solaris帐户上尝试了完全相同的功能,但确实有效。那么是我的Fedora安装?

+0

yes agree,删除前2行应该仍然有效,因为你的脚本被默认shell解释,几乎可以肯定是bash。但是文件中的'#fileformat = unix'只能是注释。请注意,你所包含的链接,他们指的是用'vi'编辑器编辑文件,确切的用法是':fileformat = unix'(注意':'char)。像':var = value'这样的文本是vi说'设置一个vi选项',在这种情况下,fileformat = unix的意思是'only only \ n(LF)char end of line not the DOS version of \ r \ n CR,LF)。其他海报是正确的,你不希望#f ..在顶部! – shellter 2011-04-28 18:36:54

散列爆炸线需要是脚本中的第一行。摆脱#fileformat=unix。还要确保你的脚本是可执行的(chmod +x scriptname)。这工作:

#!/bin/bash 
grep -iv '#$' 
+0

我不知道发生了什么,但它现在正在工作...感谢您的帮助 – raoulbia 2011-04-28 18:38:08

将其更改为ls < scriptname以便将输出传递给ls。

+0

我没有让你失望,但我想过。 ;-) ...你应该在发布前测试你的解决方案。继续发帖! – shellter 2011-04-28 17:23:42

+0

@shellter - 我在发布之前在我的Mac上测试过它,并获得与运行'ls | grep -v“#$”',也许我误解了这个问题?我认为你的解决方案能够更加灵活地通过搜索目标 – ljkyser 2011-04-28 17:32:21

+0

@shellter - 好的,我收回了;)我只是回头看看我测试的位置,我完全不在,我的不好! – ljkyser 2011-04-28 17:38:38

首先你需要#!/bin/bash作为脚本的第一行。

然后'#$'在shell参数中没有意义。你在行尾寻找'#'吗? (那没问题)。但是,如果你的意思是'$#',但是$#是参数,这意味着'命令行上的参数数量'

通常,将文件列表传送给脚本以执行操作必须完成进一步包装。所以,一个最基本的,通用的解决方案为您带来可能是问题:

$cat scriptname 
#!/bin/bash 

while read fileTargs ; do 
    grep -iv "${@}" ${fileTargs} # (search targets). 
done 

称为

ls | scriptname srchTargets 

我希望这有助于。

+0

“您是否在行末搜索'#'?”是 – raoulbia 2011-04-28 18:04:09