Shell-Script
將工作命令轉換為獲取參數的 shell 腳本文件
嗨,我的工作命令是:
grep -l "my text" file*.ext|xargs ls -lart
這個命令對我非常有用,我想創建一個 shell 文件,它可以用更少的輸入來完成,像這樣:
fn "my text" file*.ext
我來到這個shell腳本文件:
grep -l "$1" "$2"|xargs ls -lart
這不起作用,即使第一部分也不起作用:
grep -l "$1" "$2"
返回 null
您的腳本將需要兩個以上的參數。
shell
grep
在命令中執行之前grep -l "my text" file*.ext
文件名通配模式
file*.ext
擴展到所有匹配的文件名。因此,最終執行的命令行將是grep -l "my text" file1.ext file2.ext file3.ext
(如果這些是與模式匹配的文件)
因此,您的腳本可能看起來像
#!/bin/sh pattern=$1 shift grep -l -e "$pattern" "$@" | xargs ls -lrt
在這裡,模式被保存到一個變數中,然後從命令行參數列表中移出。其餘參數是文件名列表(如果命令行上的文件名通配模式匹配)並且在
"$@"
.確保雙引號
$@
。這將$@
擴展為單獨引用的命令行參數列表。我已經刪除了該
-a
選項,ls
因為在給出明確的文件名列表時不需要它。我還使用grep
with-e
來指定模式,因為帶有初始破折號 (-
) 的模式可能會混淆grep
.如果不是為了排序,我會建議使用以下
find
命令而不是您的管道(正確處理帶有空格和換行符的文件名):find . -type f -name "$filepattern" -exec grep -q -e "$pattern" {} ';' -ls
這將查找名稱與 what’s in
$filepattern
匹配且內容與 what’s in 匹配的文件$pattern
,然後生成ls -l
-like 輸出。搜尋在目前目錄中遞歸執行。作為腳本的一部分:
#!/bin/sh pattern=$1 filepattern=$2 find . -type f -name "$filepattern" -exec grep -q -e "$pattern" {} ';' -ls
該腳本需要以這樣一種方式呼叫,即文件名通配模式在呼叫它時不會被 shell 擴展:
$ ./script.sh 'my text' 'file*.ext'