0

目的の開始行から目的の行数を効率的に出力する優れたユーティリティスクリプトを見つけました。私はそれをmid.bakと名付けました、そしてそれはここの投稿に基づいています>> http://www.fastechws.com/tricks/unix/head_tail_mid_files.php

使用法:mid.bak startline numlines filename

$ cat mid.bak
#!/bin/sh
echo "Positional parameter count: $#"
tail -n +$1 $3 | head -n $2
echo "Parameter three is: $3"

ケースI:上記の通常の使用法に従って、位置パラメータ「$3」が見つかります。

$ mid.bak 3 2 file.txt
Positional parameter count: 3
This line 3 in file.txt
This line 4 in file.txt
Parameter three is: file.txt

ケースIIおよびIII:「$3」は不思議なことに存在しません。

$ mid.bak 3 2 < file.txt
Positional parameter count: 2
This line 3 in file.txt
This line 4 in file.txt
Parameter three is: 

$ cat file.txt | mid.bak 3 2
Positional parameter count: 2
This line 3 in file.txt
This line 4 in file.txt
Parameter three is: 

私の質問:上記の位置パラメータ$ 3は、通常の$ 1、$ 2 ..ケースIの参照によってスクリプトで使用できます。それでは、なぜそれがカウント "$#"に含まれず、ケースIIとIIIでエコーアウトされないのでしょうか。

4

1 に答える 1

3

Iの場合、ファイルの名前は3番目のパラメーターです。ケースIIおよびIIIの場合、3番目のパラメーターがないため$3、空の文字列に展開され、引用符で囲まれていないため、に渡されるパラメーターのリストから削除されますtailtail、引数リストでファイル名を受け取らない場合は、代わりに標準入力から読み取ります。標準入力は、ケースIIの場合file.txt<演算子を介しcat file.txtて、ケースIIIの場合はパイプラインを介しての出力に接続されます。

于 2013-03-05T21:35:28.747 に答える