Bash Script - переменный контент как команда для запуска
У меня есть Perl script, который дает мне определенные случайные числа в списке, соответствующие строкам файла. Далее я хочу извлечь эти строки из файла, используя 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
, но вывод неправильный (если я запускаю вручную команду, она отлично работает, поэтому проблем нет). Каков правильный способ сделать это?
P.S: Конечно, я могу делать всю работу в Perl, но я стараюсь учиться этому, потому что это может помочь мне в других ситуациях.
Ответы
Ответ 1
Вам просто нужно сделать:
#!/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
Согласно справке по bash:
~$ 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
Возможно, вы ищете eval $var
.
Ответ 3
line=$((${RANDOM} % $(wc -l < /etc/passwd)))
sed -n "${line}p" /etc/passwd
только с вашим файлом.
В этом примере я использовал файл /etc/password, используя специальную переменную ${RANDOM}
(о которой я узнал здесь) и выражение sed
, которое у вас было, только разница в том, что я использую двойные кавычки вместо один, чтобы разрешить расширение переменной.
Ответ 4
В случае, когда у вас есть несколько переменных, содержащих аргументы для команды, которую вы используете, а не только одну строку, вы не должны использовать 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
прочитал его как два.
Вместо этого вы можете просто использовать строку в качестве самой команды:
# 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() {
"[email protected]";
}
Обратите внимание на разницу между выходом eval
и новой функцией eval_command
:
eval_command echo_arguments arg1 arg2 "Some arg"
Результат:
Argument 1: arg1
Argument 2: arg2
Argument 3: Some arg
Argument 4: