編集-bash
$1
変数を使用しません。例は、フィールド指定子を使用している:$1
、$2
、$3
あるawk
入力レコードのフィールドは、残念ながら、私があまりにも早く一例を行なったし、混合アップ例。
これは一般的な問題だと思います。awk
デモンストレーションツールとして使用しています。目的は、(awk
)スクリプトパラメータをawk
(または任意のツール)コマンドにほのめかすことです。
awk
結果を生成するために、STDINから提供されたnまでのフィールドを使用しています。識別子は$1
、$2
、$3
ですawk
STDINストリームからフィールド。
望ましい解決策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つのパラメーターを取ります。
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
はコマンドテンプレートです。$1
通常は複数のコマンドです。入力引数を個々のセミコロンで区切られたコマンド文字列に分割します。ex
変数にロードします。ex
は、として渡されるフィルターのみ$2
です。ex
は、awk
選択/生成フィルターとして実行されるコマンドになります。action
コマンドテンプレートをループします。$ff
だけでなく、${ff}
内の構文action
コマンド文字列。$ff
。awk
またはテンプレート文字列に引数を直接挿入することができなかったため、これはまったく異なるものになりました。ただし、回避策はそれほど不便ではなく、不可解な拡張などなしですべてがどのように機能するかを示しています。
私はその考えが役に立つと信じています。スニペットが機能するようになったので、とても便利だと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加