Я продолжаю получать host = dynamici c при вводе пути к файлу в функцию bash - PullRequest
0 голосов
/ 27 марта 2020

Это дополнительный вопрос к Bash Функция, которая проверяет, есть ли текст в файле, и добавляет текст, если это не

Я пытаюсь создать bash функция, которая будет проверять, есть ли в файле текст. Если текст в файле, не текст. Если это добавить текст. Мой код:

#!/bin/bash
#Function that checks if text (ARGV1) is in a document (ARGV2). Please make ARGV1 an array of strings, with each new line a new entry in the array.

declare -a inputText=("[test]" "host=dynamic" "disallow=all" "allow=alaw" "allow=ulaw" "type=friend" "context=test" "secret=test")

function docCheckNReplace {
    local text=$1
    local document=$2
    echo $document
    local textLen=${#text[@]}
    for ((i=0; i<textLen; i++)); do
        if grep -q "${text[$i]}" $document; then
            echo 'found'
            echo ${test[$i]} 'was found in' $document
        else
            echo 'not found'
            echo ${test[$i]} >> $document
        fi
    done
}
docCheckNReplace ${inputText[@]} /home/kam/Documents/TextingSed.txt

Теперь, когда я повторяю аргумент входного filepath, он возвращает "host = dynamici c".

Когда я устанавливаю первый аргумент для inputText, а не $ {inputText [@]} он отлично работает.

У кого-нибудь есть идеи?

Спасибо:)

1 Ответ

2 голосов
/ 27 марта 2020

Вместо того, чтобы передавать строки поиска в качестве первого аргумента, передайте его как переменную для аргумента 2 и выше. Переменное число аргументов должно быть последним независимо от языка программирования.

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

Добавляет двойные кавычки вокруг переменных.

Использует printf вместо echo при форматировании строк со смешанными литералами и переменными.

Использует параметр -F с grep для поиска простого текста чем интерпретировать строку поиска как регулярное выражение.

#!/usr/bin/env bash

#Function that checks if texts (vararg ARGV2) is in a document (ARGV1).
#Please make ARGV2 an array of strings, with each new line a new entry in the array.

declare -a inputText=('[test]' 'host=dynamic' 'disallow=all' 'allow=alaw' 'allow=ulaw' 'type=friend' 'context=test' 'secret=test')

function docCheckNReplace {
    local document="$1"
    # Shift out document from arguments array
    # Now it only contains vararg search strings
    shift

    echo "$document"
    for search_string; do
        if grep -qF "$search_string" "$document"; then
            echo 'found'
            printf '%s was found in %s.\n' "$search_string" "$document"
        else
            echo 'not found'
            echo "$search_string" >> "$document"
        fi
    done
}

docCheckNReplace '/home/kam/Documents/TextingSed.txt' "${inputText[@]}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...