シェルスクリプトにコマンドを添付する方法を覚えていません。私は検索しました追加、次へ追加、つながる、そして多くは成功しませんでした。
基本的に私
belly = tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1))
if [ -z "${NUMBER+x}" ]; then # check if NUMBER exists
tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1))
else
tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1)) | cat -n
fi
うまくいきますが、反復的なロジックが好きではありません。関数や試用版を使用できることを知っていますが、これを行うより簡単な方法はありますか?私の心の中には次のようなものがあります。
belly = tail -n +$HEAD $1 | head -n $((TAIL-HEAD+1))
if [ -z "${NUMBER+x}" ]; then # check if NUMBER exists
belly
else
belly | cat -n
fi
しかし、これはうまくいきません。私は何を見逃していますか?
答え1
実際、この質問はここで回答されている可能性があります。条件付きパイプライン
この回答は、シェルif/then/else
メカニズムを使用してロジックを含めるために使用します。~へ管路。演算子を使用してこれを行うこともできますが、明確には&&
読まないので、これを好みますif
。
デフォルトでは、あなたのtail
行は次のようになります(-z
変更も参照してください-n
)。
tail -n +"$HEAD" "$1" |
head -n $((TAIL-HEAD+1)) |
if [ -n "${NUMBER+x}" ]; then cat -n; else cat; fi
(ここにはいくつかのバグがあるかもしれません。私はLinuxシェルプログラミングがあまり好きではありません。しかし、あなたは理解するでしょう。)
答え2
1つのオプションは、パイプラインの変更を管理するために変数を設定することです。変更される唯一の部分がコマンドラインパラメータである場合、実装は簡単です。
cat_arg=""
if [ -n "${NUMBER+x}" ]; then
cat_arg="-n"
fi
somepipeline ... | cat $cat_arg
しかし、パイプの最後の部分を完全に取り除くのは難しいので、猫は何も使用しません。しかし、それはおそらく重要ではないでしょう。また、状況に応じていいえ変更された引数でスペースやグローバル文字を使用できないように変数を引用します。
したがって、配列はより良いでしょう。
final=(cat)
if [ -n "${NUMBER+x}" ]; then
final=(cat -n)
fi
somepipeline ... | "${final[@]}"
あるいは、2つの関数を作成し、変数を介してそれらの1つを呼び出すこともできます。
ちなみに、シェル関数は他の質問に対する答えでもあります。
# define the function
belly() {
tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1))
}
if ... ; then
belly "$1" | this
else
belly "$1" | that
fi
$1
関数には独自の位置引数コンテキストがあるため、明示的に渡す必要があります。
答え3
基本的に達成したいことは、状態に応じて-n
オプションを渡したり渡したりしないことです。cat
$NUMBER
これを行う:
tail -n +"$HEAD" "$1" | head -n $((TAIL-HEAD+1)) | cat ${NUMBER:+'-n'}
UUOCシナリオをキャンセルすることもできます。
eval "tail -n +\"$HEAD\" \"\$1\" | head -n \$((TAIL-HEAD+1)) ${NUMBER:+|cat -n}"