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

Проблема в том, что когда я запускаю скрипт, он не находит файл. Я уже проверил позиционный параметр функции при вызове, и имя файла правильное. Но проверка этого имени файла «[-e filename]» или команды, запущенной для него (например, имя файла cat), возвращает ошибку. Имя файла не найдено.

Я вставляю свой сценарий ..

#!/bin/bash

query=
loan=

function count(){
  local valore=0
  local wordcmp
  TMPFILE=$(mktemp)

  if [ -n "$query" ]; then
    wordcmp=$query
  else wordcmp=$loan
  fi

  echo $1 (here print the correct file name passed by the caller)
  for FILE; do
    if [ -e $FILE ]; then
      cat $FILE | grep $wordcmp > $TMPFILE
      exec 3< $TMPFILE
  while read -u 3 line; do
    valore=$(($valore + ${line#$wordcmp}))
  done
      exec 3>&-
      echo "$wordcmp $valore"
      echo "Bye."
    else
      echo "$0: error --- log file $FILE not found" 1>&2
   fi
   valore=0
  done
}

set -- `getopt -o "h" -l "query,loan" -- "$@"`

while true; do

   case "$1" in

         --query) query=QUERY
              shift;;

         --loan) loan=LOAN
             shift;;

         -h) echo "$0: help" 1>&2
         echo "usage: $0 --query logfile for query summary" 1>&2
             echo "usage: $0 --loan logfile for loan summary" 1>&2
             echo "usage: $0 -h for this help message" 1>&2
         exit 1;;
         --) shift
break;;
 esac
done

if [ -z "$query" -a -z "$loan" ]; then
  echo "$0: you must specify at least one option and log file(s)" 1>&2
  echo "please type $0 -h for help" 1>&2
  exit 1
fi

if [ $# = 0 ]; then
  echo "$0: you must specify at least one log file" 1>&2
  echo "please type $0 -h for help" 1>&2
  exit 1
  shift
fi
 count $@

Вывод при вызове myscript --query filename.log

"./myscript.sh: error --- файл журнала 'filename.log' не найден"

(но файл «filename.log» существует в локальном каталоге при запуске скрипта)

Любая идея?

Спасибо всем

1 ответ1

3

В сообщаемой вами ошибке («./myscript.sh: error --- файл журнала 'filename.log' not found») есть одинарные кавычки вокруг имени файла, но команда, которая его печатает (echo "$0: error --- log file $FILE not found" 1>&2) не поместил их туда. Это говорит мне о том, что они являются частью значения $ FILE, а это означает, что он ищет их как часть фактического имени файла.

Если я прав в этом, проблема не в сценарии, а в том, как вы это называете. Итак, как вы называете этот сценарий? Если это что-то вроде этого:

cmd="./myscript.sh --loan 'filename.log'"
$cmd

... тогда это проблема, потому что цитирование в bash не работает таким образом; см. BashFAQ # 050: я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .