Bash betiğim mevcut bir dosyayı bulamıyor


0

Komut dizisinin aynı çalışma dizininde bulunan mevcut bir metin dosyasında çalışan bir bash betiği fark ettim. Betik, bir işlev parametresiyle hesaplanacak dosyanın adını alır.

Sorun betiği çalıştırdığımda dosyayı bulamıyor olmasıdır. Zaten çağrıldığında fonksiyonun pozisyon parametresini kontrol ettim ve dosyanın adı doğru. Ancak bu dosya adı "[-e dosyaadı]" veya bunun üzerine başlatılan bir komut (örneğin, cat dosyaadı) üzerine bir kontrol bir hata döndürür. Dosya adı bulunamadı.

Senaryomu yapıştırıyorum ..

#!/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 çağrılırken çıktısı:

"./myscript.sh: error --- log file 'dosyaadı.log' bulunamadı"

(ancak "dosyaadı.log" dosyası, komut dosyası başlatıldığında yerel dizinde bulunur)

Herhangi bir fikir?

Herkese teşekkürler


1
test etmek için kodlamayı denedin mi?
pnömatik

-X anahtarını 1 numaralı hatta bash yapmak için kullanmayı denediniz mi? FILE'in sayma fonksiyonunun for döngüsündeki yerini hiçbir zaman bir değerle doldurmadığını anlamıyorum. $ 1 --query'yi ekler mi, yani $ 2 dosyaadı.log olmalıdır? Yoksa sayım sadece tek bir parametre / argümanla mı çağrılıyor?
Daniel Liston

Yanıtlar:


3

Verdiğin hata ("./myscript.sh: error --- günlük dosyası 'dosyaadı.log' bulunamadı)) dosya adı etrafında tek tırnaklara sahip, ancak onu ( echo "$0: error --- log file $FILE not found" 1>&2) basan komut bunları koymadı Orada. Bu bana $ FILE değerinin bir parçası olduklarını, yani onları gerçek dosya adının bir parçası olarak aradıklarını gösteriyor.

Bu konuda haklıysam, senaryoda değil, onu nasıl adlandırdığınızla ilgili bir sorun var. Peki bu senaryoyu nasıl çağırıyorsun? Eğer böyle bir şeyse:

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

... o zaman sorun bu, çünkü bashta alıntı yapmak bu şekilde çalışmıyor; bkz. BashFAQ # 050: Bir değişkene bir komut koymaya çalışıyorum, ancak karmaşık durumlar her zaman başarısız oluyor .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.