Выполнить функцию с аргументами, перечисленными в текстовом файле - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть текстовый файл (примечание - первые 3 строки пусты), в котором есть функция со значением аргументов, указанным, как показано ниже.

Текстовый файл:




Function_1  <arguments_1>  <arguments_2> <arguments_3> <arguments_4> 
Function_2  <arguments_1>  <arguments_2> <arguments_3> <arguments_4> 
Function_3  <arguments_1>  <arguments_2> <arguments_3> <arguments_4> 

В сценарии оболочки, У меня есть определение функции.

Требуется прочитать содержимое (т. Е. Функцию со значением аргумента) из 4-й строки, доступной в текстовом файле, и выполнить функцию, присутствующую в сценарии оболочки.

Оболочкаскрипт:

#!/bin/bash
logfile=Execution_$now.log
exec 2>&1 | tee $logfile
Text_File = <path> 
while IFS= read -r line
do
  echo "$line"
done < "$Text_File"

Function_1()
{
  exec &> $1_$(date "+%Y%m%d%H%M").log
  Change=$1
  Command=$2
  if [[ $Command == "get" ]];
    then Command_1="getfacl"
  elif [[ $Command == "set" ]];
    then Command_1="setfacl"
  fi

  Tag=$3
  if [[ -z "$Tag" ]];
    then Tag=""
    else Tag="-$Tag"
  fi
echo " "
echo "#############"
echo "Test Script"
echo "#############"
echo "Simply testing the script execution"
}

Ответы [ 2 ]

3 голосов
/ 30 сентября 2019

Либо введите текстовый файл:

. '/path/to/file'

или

source '/path/to/file'

Или прочитайте ваш файл как массив, чтобы каждая команда и аргументы были правильно разделены средой IFSпеременная.

text_file='/path/to/file'
declare -a command_and_args_array
while read -r -a command_and_args_array # Read a command with arguments line
do
  "${command_and_args_array[@]}" # Execute the command with its arguments
done < "$text_file"
1 голос
/ 01 октября 2019

Вы можете использовать declare -f some_function, чтобы увидеть, существует ли оно, прежде чем пытаться вызвать его:

#!/bin/bash

usage() {
    cat <<EOT
Usage: ${0##*/} text-file1 | - [text-file2 ...]
    Read function calls with parameters from text files or - for stdin.
    Run the function with its parameters if the function exists.
EOT
}

test "${#}" -eq 0 && {
    usage
    exit
}

Function_1() {
    # add logging, etc. here
    echo "\${@}: ${@}"
}

while read -r line; do
    # assign positional parameters to the contents of $line
    set -- $line

    # call function with new positional parameters if the function exists
    declare -f "$1" > /dev/null && "${@}"
done < <(cat "${@}")

Проверка, существует ли функция, добавляет некоторую защиту от случайного запуска произвольных команд. Это также приводит к пропуску пустых строк и строк с неподдерживаемыми функциями, которые не определены в главном сценарии.

...