2011-04-28 107 views
1

當我在命令行它的工作原理上運行此: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

回答

1

散列爆炸線需要是腳本中的第一行。擺脫#fileformat=unix。還要確保你的腳本是可執行的(chmod +x scriptname)。這工作:

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

我不知道發生了什麼,但它現在正在工作...感謝您的幫助 – raoulbia 2011-04-28 18:38:08

0

將其更改爲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

0

首先你需要#!/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