Shell-Script

將工作命令轉換為獲取參數的 shell 腳本文件

  • September 13, 2018

嗨,我的工作命令是:

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

您的腳本將需要兩個以上的參數。

shellgrep在命令中執行之前

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因為在給出明確的文件名列表時不需要它。我還使用grepwith-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'

引用自:https://unix.stackexchange.com/questions/459150