bashスクリプトファイルでコマンドをパラメーター化するにはどうすればよいですか?

意志

編集-bash$1変数を使用しません例は、フィールド指定子を使用している:$1$2$3あるawk入力レコードのフィールドは、残念ながら、私があまりにも早く一例を行なったし、混合アップ例。

これは一般的な問題だと思います。awkデモンストレーションツールとして使用しています。目的は、(awk)スクリプトパラメータをawk(または任意のツール)コマンドにほのめかすことです

awk結果を生成するために、STDINから提供されたnまでのフィールドを使用しています識別子は$1$2$3ですawkSTDINストリームからフィールド。

望ましい解決策A(好ましい概念)、次のようなもの...

#!/bin/bash  -f
#   script: blue.sh
#
    awk -e '{ print $1 " and " $2 " silly example" ;}'
#

そして、望ましい出力:

$  echo  "red blue yellow" > ./blue.sh 
red and blue silly example
$

代替案Bはおそらく次のように考えることができます。

#!/bin/bash  -f
#   script: green.sh
#
    wrk="awk -e '{ print \$3 \" and \" \$2 \" variable example\" ;}'  "
#
    echo "work is:"
    echo $wrk
    echo
    $wrk

そして、望ましい出力:

$  echo  "red blue yellow" > ./green.sh 
wrk is:
awk -e '{ print $3 " and " $2 " variable example" ;}'  

yellow and blue variable example
$

問題は、-eの引用にあります。

これらの例のいずれかまたはこれらを達成するための手段はありますか?

意志

私は解決策を見つけましたが、それは当初のビジョンとはかなり異なることが判明しました。bashコマンドで-script変数を展開する方法を見つけることができなかったため、「構築」する必要があります。xargsシェルがそのことをどのように実行したかと関係があるいくつかの理由で、それは不適切であること判明しました。

実行例を示してからコードを示し、どのように/何が起こっているかを説明します。「#(2)」などのラベルで話し合うエリアをマークしました。

入力..。

$ svn status -qu ..
M            28637   /src/line.h
M            28637   /src/line.cpp
        *    28637   /testing/CheckWindows.py

処理..。

繰り返しスクリプトは2つのパラメーターを取ります。

  1. 入力リストで実行するテンプレートまたは1つ以上のコマンド
  2. awk入力ストリームをフィルタリングするためのいくつかのコマンド

コマンドライン:

 svn status -qu .. | repeat                                        \
                       'cp -v $ff  /mnt/testhost/testarea/r02/$ff' \
                       "{  if( $1 == "M" ){ print  $3; } }"

出力..。

'/src/line.h' -> '/mnt/testhost/testarea/r02/src/line.h'
'/src/line.cpp' -> '/mnt/testhost/testarea/r02/src/line.cpp'

何が起こったの

  • ローカルで変更されたファイルのみがにコピーされます r02/testarea
    • 明らかに、フィルタリングは何でもかまいません
  • の目的は、repeat入力からフィルタリングされたリストで一連のコマンドを繰り返すことです。

注釈付きコード

    #!/bin/bash
    #   repeat.bash

    function  repeat
    {
        local -a    actions=()
        local       DELIMITER=";"
        local       filter="${2}"
        local       cmd=""

        local       wrk="${1}${DELIMITER}"        # (1)   Template
        local       str=""


        while [[ $wrk  ]]                         # (2)   Split-up individual commands
        do
            str="${wrk%%"${DELIMITER}"*}"
            actions+=( "${str}" )

            wrk="${wrk#*"${DELIMITER}"}"
        done

        echo    "actions: "                       # (3)   Debugging code

        for action in "${actions[@]}"
        do
            echo  "        => \"${action}\"."
        done
        echo  "filter  => '${filter}'."


        ex="${filter}"                            # (4)   Awk instructions to 
                                                  #       process input stream


        for ff in $(awk -e "${ex}")               # (5)   .
        do
            for action in "${actions[@]}"         # (6)   .
            do
                cmd="${action//\$\{ff\}/${ff}}"   # (7)   .
                cmd="${cmd//\$ff/${ff}}"

                ${cmd}                            # (8)   .
            done
        done

        return

    }

    repeat  "${@:1}"                              # (9)   .

  1. Arg$1はコマンドテンプレートです。
    *
    後で解析できるように、末尾に区切り文字が追加されています
  2. $1通常は複数のコマンドです。入力引数を個々のセミコロンで区切られたコマンド文字列に分割します。
  3. 確認のためにパラメータを印刷します。
  4. フィルタをex変数にロードします。
    *
    この例でexは、として渡されるフィルターのみ$2です。
  5. フィルタリングされた入力行から生成された各文字列をループします。
    *
    exは、awk選択/生成フィルターとして実行されるコマンドになります。
  6. すべてのactionコマンドテンプレートをループします
  7. 展開$ffだけでなく、${ff}内の構文actionコマンド文字列。
  8. ファイルごとに生成された各コマンドラインを実行します$ff
  9. 関数を呼び出してスクリプトを実行します。

awkまたはテンプレート文字列に引数を直接挿入することができなかったため、これはまったく異なるものになりましたただし、回避策はそれほど不便ではなく、不可解な拡張などなしですべてがどのように機能するかを示しています。

私はその考えが役に立つと信じています。スニペットが機能するようになったので、とても便利だと思います。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

bashスクリプトでパラメータを他のコマンドに転送するにはどうすればよいですか?

分類Dev

このスクリプト化されたJenkinsパイプラインを適切にリファクタリングして、共通のコードを1つのファイルに保存するにはどうすればよいですか?

分類Dev

コマンドラインからJenkinsperlスクリプトにパラメータを入力するにはどうすればよいですか?

分類Dev

Rスクリプトからコマンドラインパラメータを読み取るにはどうすればよいですか?

分類Dev

ターミナルコマンド用のスクリプトファイルを作成するにはどうすればよいですか?

分類Dev

ターミナルコマンド用のスクリプトファイルを作成するにはどうすればよいですか?

分類Dev

bashスクリプトファイルでネガティブパターンマッチを行うにはどうすればよいですか?

分類Dev

さまざまなパラメーターと値に対して、次のコマンドを自動化して一般化する方法(bashスクリプトで使用する場合)はどうすればよいですか?

分類Dev

bashスクリプトを使用してファイルを別のコンピューターに送信するにはどうすればよいですか?

分類Dev

コマンドラインからフランスのWindowsシステムでファイルとプリンターの共有をアクティブ化するにはどうすればよいですか?

分類Dev

ポストスクリプト印刷ファイルにプリンタードライバーのパラメーターを配置するにはどうすればよいですか?

分類Dev

Freebsd OSのpsqlコマンドラインでスクリプトを実行しているときに、エラーメッセージとともに出力をファイルに記録するにはどうすればよいですか?

分類Dev

コマンドラインを使用して、Doxygenでプロジェクト固有のパラメーターを使用して生成された構成ファイルを編集するにはどうすればよいですか?

分類Dev

セマンティックバージョンをバンプせずに、インクリメンタルファウンドリトランスフォームジョブを非インクリメンタルにビルドするように強制するにはどうすればよいですか?

分類Dev

スクリプトパラメータをjsファイルに使用するにはどうすればよいですか?

分類Dev

コマンドラインから別のパターンに一致するディレクトリ内でパターンに一致するファイルを「見つける」にはどうすればよいですか?

分類Dev

コマンドラインからファイル/ディレクトリパスを選択するようにGUIダイアログボックスでユーザーに促すにはどうすればよいですか?

分類Dev

コマンドラインからファイル/ディレクトリパスを選択するようにGUIダイアログボックスでユーザーに促すにはどうすればよいですか?

分類Dev

WinFormsクライアントアプリケーションでコマンドパターンを使用するにはどうすればよいですか?

分類Dev

bashスクリプトでコマンドラインツールの複数のインスタンスを実行するにはどうすればよいですか?+スクリプトのユーザー入力

分類Dev

静的ファクトリーメソッドでオーバーライドされたメソッドでインスタンスを作成するときに、囲んでいるクラスのプライベートフィールドにアクセスするにはどうすればよいですか?

分類Dev

forループ内でパラメーター化されたコンストラクターを呼び出すにはどうすればよいですか。

分類Dev

フラスコアプリケーションの初期化時にファイルをロードするにはどうすればよいですか

分類Dev

このスクリプトファイルの関数を毎回ソースすることなくロードするにはどうすればよいですか?「コマンドが見つかりません」(Bash /スクリプトの基本)

分類Dev

文字列パラメータを含むbashスクリプトに指定されたすべてのコマンドライン引数をそのまま子プロセスに渡すにはどうすればよいですか?

分類Dev

bashスクリプトのコマンドの複数行出力のフィールドをテストするにはどうすればよいですか?

分類Dev

コマンドラインプログラムでユーザーにディレクトリへのファイルパスを指定させるにはどうすればよいですか?

分類Dev

toString()メソッドがインスタンスフィールドとともにスーパークラスのプライベートフィールドを返すようにするにはどうすればよいですか?

分類Dev

Mac AppStoreのosxアプリケーションにコマンドラインユーティリティをバンドルするにはどうすればよいですか(サンドボックスエンタイトルメントを使用)

Related 関連記事

  1. 1

    bashスクリプトでパラメータを他のコマンドに転送するにはどうすればよいですか?

  2. 2

    このスクリプト化されたJenkinsパイプラインを適切にリファクタリングして、共通のコードを1つのファイルに保存するにはどうすればよいですか?

  3. 3

    コマンドラインからJenkinsperlスクリプトにパラメータを入力するにはどうすればよいですか?

  4. 4

    Rスクリプトからコマンドラインパラメータを読み取るにはどうすればよいですか?

  5. 5

    ターミナルコマンド用のスクリプトファイルを作成するにはどうすればよいですか?

  6. 6

    ターミナルコマンド用のスクリプトファイルを作成するにはどうすればよいですか?

  7. 7

    bashスクリプトファイルでネガティブパターンマッチを行うにはどうすればよいですか?

  8. 8

    さまざまなパラメーターと値に対して、次のコマンドを自動化して一般化する方法(bashスクリプトで使用する場合)はどうすればよいですか?

  9. 9

    bashスクリプトを使用してファイルを別のコンピューターに送信するにはどうすればよいですか?

  10. 10

    コマンドラインからフランスのWindowsシステムでファイルとプリンターの共有をアクティブ化するにはどうすればよいですか?

  11. 11

    ポストスクリプト印刷ファイルにプリンタードライバーのパラメーターを配置するにはどうすればよいですか?

  12. 12

    Freebsd OSのpsqlコマンドラインでスクリプトを実行しているときに、エラーメッセージとともに出力をファイルに記録するにはどうすればよいですか?

  13. 13

    コマンドラインを使用して、Doxygenでプロジェクト固有のパラメーターを使用して生成された構成ファイルを編集するにはどうすればよいですか?

  14. 14

    セマンティックバージョンをバンプせずに、インクリメンタルファウンドリトランスフォームジョブを非インクリメンタルにビルドするように強制するにはどうすればよいですか?

  15. 15

    スクリプトパラメータをjsファイルに使用するにはどうすればよいですか?

  16. 16

    コマンドラインから別のパターンに一致するディレクトリ内でパターンに一致するファイルを「見つける」にはどうすればよいですか?

  17. 17

    コマンドラインからファイル/ディレクトリパスを選択するようにGUIダイアログボックスでユーザーに促すにはどうすればよいですか?

  18. 18

    コマンドラインからファイル/ディレクトリパスを選択するようにGUIダイアログボックスでユーザーに促すにはどうすればよいですか?

  19. 19

    WinFormsクライアントアプリケーションでコマンドパターンを使用するにはどうすればよいですか?

  20. 20

    bashスクリプトでコマンドラインツールの複数のインスタンスを実行するにはどうすればよいですか?+スクリプトのユーザー入力

  21. 21

    静的ファクトリーメソッドでオーバーライドされたメソッドでインスタンスを作成するときに、囲んでいるクラスのプライベートフィールドにアクセスするにはどうすればよいですか?

  22. 22

    forループ内でパラメーター化されたコンストラクターを呼び出すにはどうすればよいですか。

  23. 23

    フラスコアプリケーションの初期化時にファイルをロードするにはどうすればよいですか

  24. 24

    このスクリプトファイルの関数を毎回ソースすることなくロードするにはどうすればよいですか?「コマンドが見つかりません」(Bash /スクリプトの基本)

  25. 25

    文字列パラメータを含むbashスクリプトに指定されたすべてのコマンドライン引数をそのまま子プロセスに渡すにはどうすればよいですか?

  26. 26

    bashスクリプトのコマンドの複数行出力のフィールドをテストするにはどうすればよいですか?

  27. 27

    コマンドラインプログラムでユーザーにディレクトリへのファイルパスを指定させるにはどうすればよいですか?

  28. 28

    toString()メソッドがインスタンスフィールドとともにスーパークラスのプライベートフィールドを返すようにするにはどうすればよいですか?

  29. 29

    Mac AppStoreのosxアプリケーションにコマンドラインユーティリティをバンドルするにはどうすればよいですか(サンドボックスエンタイトルメントを使用)

ホットタグ

アーカイブ