Bash betiği - çalıştırılacak komut olarak değişken içerik


159

Bana bir dosyanın satırlarına karşılık gelen tanımlanmış bir liste rasgele sayılar veren bir Perl komut dosyası var. Sonra kullanarak bu satırları dosyadan ayıklamak istiyorum sed.

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

Değişken vargibi bir çıktı verir: cat last_queries.txt | sed -n '12p;500p;700p'. Sorun şu ki bu son komutu çalıştıramam. Ben denedim $var, ama çıkış doğru değil (Eğer komut el ile çalıştırırsanız iyi çalışır, bu yüzden orada sorun yok). Bunu yapmanın doğru yolu nedir?

PS: Elbette Perl'deki tüm işleri yapabilirdim, ama bu şekilde öğrenmeye çalışıyorum, çünkü bu başka durumlarda bana yardımcı olabilir.

Yanıtlar:


215

Yapmanız gereken sadece:

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

Ancak, Perl komutunuzu daha sonra çağırmak istiyorsanız ve bu yüzden onu bir değişkene atamak istiyorsanız, o zaman:

#!/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

Bash'ın yardımına göre:

~$ 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

sadece dosyanızla.

Bu örnekte, ${RANDOM}(burada öğrendiğim) özel değişkeni kullanarak / etc / password dosyasını kullandım ve sahip olduğunuz sedifade, tek fark, değişken genişlemesine izin vermek için tek yerine çift tırnak kullanıyorum.


2

Eğer, sen gereken bir komut için sadece tek bir dize çalışan ve değiliz argümanları içeren birden çok değişkeni var nerede yok aşağıdaki durumlarda başarısız olur gibi eval doğrudan kullanın:

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"

Sonuç:

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

"Bazı bağımsız değişkenler" tek bir bağımsız değişken olarak iletilse de, evalbunu iki olarak okuyun.

Bunun yerine, dizeyi komutun kendisi olarak kullanabilirsiniz:

# 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() {
  "$@";
}

Çıkışı ile evalyeni eval_commandfonksiyon arasındaki farka dikkat edin :

eval_command echo_arguments arg1 arg2 "Some arg"

Sonuç:

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

1
Eval ile ilk örnekte olduğu gibi, uzay sonra her elemanın değerlendirilmesini önlemek için, tek tırnak ile sarın: eval 'echo_arguments arg1 arg2 "Some arg"'. Daha sonra çıktı ikinci örneğinizdeki gibi olacaktır.
Noam Manos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.