以下を実行するスクリプトにログをパラメータとして渡そうとします。
#!/bin/bash
filter(){
grep -E "ERROR|FATAL|WARN|Caused|^[[:space:]]" /app/me/logs/$1
}
#read varName
filter > /app/me/logs/${1}.filtered
cat /app/me/logs/${1}.filtered
しかし、何も出力せず、生成されたログファイルには何もありません。私が渡すコマンドは次のとおりです。
>>> log_filter test.log
log_filterはスクリプトの名前、test.logはフィルタリングしたいパラメータログです。ご覧のとおり、「read varName」と書いていますが、各スクリプトに$ 1の代わりにvarNameを渡すと機能しますが、機能しません。欲しいです。
答え1
変更:
filter > /app/me/logs/${1}.filtered
到着する:
filter "$@" > "/app/me/logs/${1}.filtered"
なぜ?各関数には独自の位置パラメータのリストがあります。呼び出す関数に位置引数のリストを指定する必要があります。
つまり、関数の内部は
基本スクリプトと同じではありません。$1
filter
$1
パラメータが1つだけ必要な場合:
filter "$1" > "/app/me/logs/${1}.filtered"
それだけで十分です。