Как сделать «словарь» с функциями оболочки? - PullRequest
1 голос
/ 15 марта 2019

Это мой код:

#!/bin/sh
echo "ARGUMENTS COUNT : " $#
echo "ARGUMENTS LIST  : " $*

dictionary=`awk '{ print $1 }'`

function()
{
   for i in dictionary
   do
      for j in $*
      do
         if [ $j = $i ]
         then
            ;
         else
            append
         fi
      done
   done
}

append()
{
   ls $j > dictionary1.txt
}

function

Мне нужно с помощью функций оболочки unix сделать "словарь".Например: я пишу в аргументах слово по умолчанию, например hello.Затем моя функция проверяет файл dictionary1, существует ли это слово в файле.Если нет - добавить это слово в файл, если оно уже существует - ничего не делать.

По какой-то причине мой скрипт не работает.Когда я запускаю свой скрипт, он что-то ждет и все.

Что я делаю не так?Как я могу это исправить?

Ответы [ 4 ]

4 голосов
/ 15 марта 2019

Реализация, которая пытается заботиться о производительности и корректности, может выглядеть следующим образом:

#!/usr/bin/env bash
#              ^^^^- NOT sh; sh does not support [[ ]] or <(...)

addWords() {
  local tempFile dictFile
  tempFile=$(mktemp dictFile.XXXXXX) || return
  dictFile=$1; shift

  [[ -e "$dictFile" ]] || touch "$dictFile" || return

  sort -um "$dictFile" <(printf '%s\n' "$@" | sort -u) >"$tempFile"
  mv -- "$tempFile" "$dictFile"
}

addWords myDict beta charlie delta alpha
addWords myDict charlie zulu
cat myDict

... имеет окончательное состояние словаря:

alpha
beta
charlie
delta
zulu

... ион перечитывает входной файл только один раз для каждого вызова addWords (независимо от того, сколько слов добавляется!), а не один раз для добавления каждого слова.

2 голосов
/ 15 марта 2019
  • Не называйте функцию «функцией».

  • Не читайте и не просматривайте весь файл - все, что вам нужно, это знать, есть слово или нет. grep делает это.

  • ls перечисляет файлы. Вы хотите отправить слово в файл, а не имя файла. используйте echo или printf.

  • sh не bash. Используйте bash, если нет явной причины не делать этого, и единственная причина в том, что она недоступна.

Попробуйте это:

#! /bin/env bash
checkWord() {
 grep -qm 1 "$1" dictionary1.txt ||
    echo "$1" >> dictionary1.txt
}

for wd
do checkWord "$wd"
done

Если это работает, вы можете добавить дополнительную структуру и проверку ошибок.

2 голосов
/ 15 марта 2019

Вы можете удалить строку dictionary=awk... (как уже упоминалось, она блокирует ожидание ввода) и просто добавьте файл словаря для каждого аргумента, как показано ниже:

for i in "$@"
do
  if ! grep -qow "$i" dictionary1.txt
  then
    echo "$i" >> dictionary1.txt
  fi
done
0 голосов
/ 15 марта 2019

С любым awk в любой оболочке на любой коробке UNIX:

awk -v words="$*" '
BEGIN {
    while ( (getline word < "dictionary1.txt") > 0 ) {
        dict[word]++
    }
    close("dictionary1.txt")

    split(words,tmp)
    for (i in tmp) {
        word = tmp[i]
        if ( !dict[word]++ ) {
            newWords = newWords word ORS
        }
    }

    printf "%s", newWords >> "dictionary1.txt"
    exit
}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...