Ini adalah pertanyaan lanjutan untuk Fungsi Bash yang memeriksa apakah ada teks dalam file dan menambahkan teks jika tidak

Saya mencoba membuat fungsi bash yang akan memeriksa apakah suatu file memiliki teks di dalamnya. Jika teks dalam file tidak teks. Jika sudah tambahkan teksnya. Kode saya adalah

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

Sekarang, setiap kali saya menggemakan argumen filepath input, ia mengembalikan "Host=dynamic".

Ketika saya mengatur argumen pertama ke inputText dan bukan ${inputText[@]} itu berfungsi dengan baik.

Ada yang punya ide?

Terima kasih :)

0
KamKam 27 Maret 2020, 17:42

1 menjawab

Jawaban Terbaik

Alih-alih meneruskan string pencarian sebagai argumen pertama, berikan sebagai vararg untuk argumen 2 dan di atasnya. Jumlah variabel argumen harus yang terakhir terlepas dari bahasa pemrogramannya.

Literal string ditulis dalam tanda kutip tunggal untuk menghindari penguraian secara efisien untuk sintaks ekspansi variabel/sub-kulit potensial.

Menambahkan tanda kutip ganda di sekitar variabel.

Menggunakan printf daripada echo saat memformat string dengan literal dan variabel campuran.

Menggunakan opsi -F dengan grep untuk mencari teks biasa daripada menafsirkan string pencarian sebagai Regex.

#!/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[@]}"
2
Léa Gris 27 Maret 2020, 16:17