1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルプログラミングにおけるShiftの使い方まとめ

2022-01-05 12:51:56

位置の引数は、shiftコマンドで左にずらすことができる。例えば、shift 3は、元の$4が$1、元の$5が$2などになることを意味します。元の$1、$2、$3は破棄され、$0は移動しません。引数なしのシフト・コマンドは、シフト1と同じです。
位置変数やコマンドライン引数については、その番号を決定する必要があること、またはシェルプログラムがその番号を知らない場合、すべての引数をまとめて変数 $* に代入できることを知っています。もしユーザーが、位置変数の数を知らずに、シェルに引数を一つずつ処理するように頼んだ場合、つまり、$1の次は$2、$2の次は$3、といった具合になります。シフト・コマンドを実行する前の変数$1の値は、シフト・コマンドを実行した後には利用できなくなります。

例としては、以下のようになります。

# Test the shift command (x_shift.sh)
until [ $# -eq 0 ]
do
echo "First argument is: $1 Number of arguments is: $#"
shift
done
Execute the above program x_shift.sh.
$. /x_shift.sh 1 2 3 4

結果は以下のように表示されます。

最初のパラメータは:1 パラメータの数は:1 4
最初のパラメータは:2 パラメータの数は:1です。3
最初のパラメータは: 3 パラメータの数は: 2です。
最初のパラメータは:4 パラメータの数は:です。1

上で見たように、shiftコマンドを実行するたびに、変数の数($#)が1つ減り、変数の値が1つ進むので、次のコードでは、untilとshiftを使って、すべてのコマンドライン引数の合計を計算することにしています。

Application of the #shift upshift command (x_shift2.sh)
if [ $# -eq 0 ]
then
echo "Usage:x_shift2.sh arguments"
exit 1
fi
sum=0
until [ $# -eq 0 ]
do
sum=`expr $sum + $1`
shift
done
echo "sum is: $sum"



上記のプログラムを実行します。

$x_shift2.sh 10 20 15

結果は次のように表示されます。

45

  もう一つの重要な使い方は、Bsh では $1 から $9 までの 9 つの位置変数が定義されていることです。これは、ユーザーがコマンドライン上で 9 つの引数に制限されるわけではなく、9 つ以上の引数にシフトコマンドでアクセスできることを意味します。

  shiftコマンドが一度に移動させる引数の数は、その引数によって指定されます。たとえば、シェル・プログラムが最初の 9 つのコマンドライン引数を処理した後、shift 9 コマンドを使用して $10 を $1 に移動させることができます。

拡張機能です。シェルgrepコマンドの拡張機能

背景 オンライントラブルシューティングの問題では、特定の特性を持つログを見つけ、それらのログの完全な起動ログリンクを取得する必要があります。 

例えば、これらのログのリクエストID[Span ID]は、何らかのタグで取得します。

cat xxxx.log | grep 'some tag' | awk -F 'some tag' '{print $2}' 

次に、すべてのSpanIdの完全なログチェーンを取得するために、もう1つのステップがあります。もちろん、今のところ、バッチ実行のためにxargsを使う必要があります。しかし、ここで問題があります。grepはこの使い方をサポートしていません。

以下のようになります。

[localhost ~]$ cat xxxxxx.log | grep 'some tag' | awk -F 'some tag' '{print $2}' | xargs grep xxxxxx.log

grep: 某SpanId: No such file or directory

grep 第 1 引数はキーワード regular で、その後にファイルパスを指定します。

そこで、これを解決するために、ここでは grepx という名前の SHELL スクリプトを修正して、grep コマンドを強化する必要があります。

#! /bin/bash

FILE_PATH="$1*"

COUNT=0
while [ $# -gt 0 ]
do
    if [ $COUNT -gt 0 ]
    then
        grep "$1" $FILE_PATH
        # output blank lines to separate logs   
       echo -e "\n\n"
    fi

    The #shift command is used to shift parameters (left shift), and is usually used to traverse each parameter in turn without knowing the number of incoming parameters
    shift
    let COUNT=COUNT+1
done

原理は、パラメータの位置を入れ替え、shiftコマンドで移動させ、パイプラインやコンソールから渡されたパラメータを一括して読み込むというものです。

すると、シェルスクリプトは次のように書くことができる。

cat xxxxxx.log | grep 'some tag' | awk -F 'some tag' '{print $2}' | xargs ~/grepx xxxxxx.log

シェルプログラミングにおけるShiftの使い方についての記事は以上です。シェルプログラミングにおけるShiftの使い方については、スクリプトハウスの過去の記事を検索するか、以下の記事を引き続き閲覧してください。