コマンドを追加する方法

コマンドを追加する方法

シェルスクリプトにコマンドを添付する方法を覚えていません。私は検索しました追加次へ追加つながる、そして多くは成功しませんでした。

基本的に私

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}"

関連情報