Bashスクリプト-実行するコマンドとしての可変コンテンツ


159

ファイルの行に対応する乱数を定義済みリストにしてくれるPerlスクリプトがあります。次に、を使用してこれらの行をファイルから抽出しますsed

#!/bin/bash
count=$(cat last_queries.txt | wc -l)
var=$(perl test.pl test2 $count)

変数varは次のような出力を返しますcat last_queries.txt | sed -n '12p;500p;700p'。問題は、この最後のコマンドを実行できないことです。で試しました$varが、出力が正しくありません(コマンドを手動で実行した場合、正常に機能するため問題はありません)。これを行う正しい方法は何ですか?

PS:もちろん、Perlですべての作業を行うことができますが、他の状況でも役立つので、この方法を学習しようとしています。

回答:


215

あなたはただ行う必要があります:

#!/bin/bash
count=$(cat last_queries.txt | wc -l)
$(perl test.pl test2 $count)

ただし、後でPerlコマンドを呼び出す必要があり、それを変数に割り当てたい場合は、次のようにします。

#!/bin/bash
count=$(cat last_queries.txt | wc -l)
var="perl test.pl test2 $count" # You need double quotes to get your $count value substituted.

...stuff...

eval $var

バッシュの助けによると:

~$ help eval
eval: eval [arg ...]
    Execute arguments as a shell command.

    Combine ARGs into a single string, use the result as input to the shell,
    and execute the resulting commands.

    Exit Status:
    Returns exit status of command or success if command is null.


2
line=$((${RANDOM} % $(wc -l < /etc/passwd)))
sed -n "${line}p" /etc/passwd

代わりにファイルを使用します。

この例では、ファイル/ etc / passwordを使用し、特殊変数${RANDOM}(ここで学んだこと)とsed式を使用しましたが、変数の拡張を可能にするために、単一引用符ではなく二重引用符を使用している点が異なります。


2

単一の文字列だけでなく、実行中のコマンドの引数を含む複数の変数がある場合、次の場合に失敗するため、evalを直接使用しないでください。

function echo_arguments() {
  echo "Argument 1: $1"
  echo "Argument 2: $2"
  echo "Argument 3: $3"
  echo "Argument 4: $4"
}

# Note we are passing 3 arguments to `echo_arguments`, not 4
eval echo_arguments arg1 arg2 "Some arg"

結果:

Argument 1: arg1
Argument 2: arg2
Argument 3: Some
Argument 4: arg

「Some arg」が単一の引数として渡されたとしても、evalそれを2つとして読み取ることに注意してください。

代わりに、文字列をコマンド自体として使用できます。

# The regular bash eval works by jamming all its arguments into a string then
# evaluating the string. This function treats its arguments as individual
# arguments to be passed to the command being run.
function eval_command() {
  "$@";
}

の出力evalと新しいeval_command関数の違いに注意してください。

eval_command echo_arguments arg1 arg2 "Some arg"

結果:

Argument 1: arg1
Argument 2: arg2
Argument 3: Some arg
Argument 4:

1
スペースの後の各要素の評価を回避するには、evalを使用した最初の例のように、一重引用符で囲みます eval 'echo_arguments arg1 arg2 "Some arg"'。その後、出力は2番目の例のようになります。
Noam Manos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.