Слово не расширяется в команду оболочки в bash - PullRequest
0 голосов
/ 21 мая 2019

Может ли кто-нибудь помочь в этом:

Я хочу выполнить некоторые команды в сценарии оболочки, прочитав их из другого текстового файла, например, так:

command_file.txt содержит:

EXECUTED_OK_$(date)
EXECUTED_OK_$(hostname)

shell script.sh

#!/bin/sh

while read command
do
echo $command 
done < command_file.txt

Моя проблема в том, что эхо печатает как текст, как в командном файле. Как я могу сделать так, чтобы он расширялся и печатал фактическую дату и имя хоста.

Например Ожидаемый результат должен быть:

EXECUTED_OK_22-02-2010 11:10:10
EXECUTED_OK_localhost

Но я получаю:

EXECUTED_OK_$(date)
EXECUTED_OK_$(hostname)

Ответы [ 3 ]

1 голос
/ 21 мая 2019

используйте eval для расширения переменных и повторного выполнения.

$ foo='EXECUTED_OK_$(date)'
$ echo $foo
EXECUTED_OK_$(date)
$ eval "echo $foo"
EXECUTED_OK_Tue May 21 12:39:45 PDT 2019

РЕДАКТИРОВАТЬ: eval является мощным, но может быть опасным; это в основном внедрение кода. Цитировать аргументы - хорошая идея; см. комментарии ниже для более подробного объяснения.

0 голосов
/ 21 мая 2019

Один из вариантов - использовать eval, при условии, что вы доверяете входной файл

#!/bin/sh

while read command; do 
  eval "echo $command" 
done < command_file.txt
0 голосов
/ 21 мая 2019

Этот подход с использованием белого списка не позволяет выполнять произвольный код, как eval. Если безопасность не является проблемой, вам следует придерживаться eval, поскольку внешние элементы, используемые в этом примере, имеют много угловых случаев, для которых замена не будет работать должным образом.

Программа заменяет некоторые внешние объекты, на которые есть ссылки в каждой команде вашего командного файла, на их вывод перед печатью команды:

#!/bin/bash

while read command
do
    while read -a external ; do
        output=$( "${external[@]}" )
        command=$( sed "s/\$(${external})/${output}/g" <<< "$command" )
    done <<END
    date -R
    hostname
END
    echo "$command"
done < command_file.txt

Чтобы использовать больше внешних объектов, вам нужно добавить их в heredoc в диапазоне от <<END до END. Я добавил -R к date, чтобы продемонстрировать внешнее с аргументами.

Как уже указывалось, никакая обработка (например, кавычки, подстановки), за исключением разделения слов, не будет выполняться для внешних команд (пробелы могут быть экранированы (one\ two) вместо кавычек).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...