Случайный случай

Это для кода:

set source_failed = `cat mine.log`

set dest_failed = `cat their.log`

foreach t ($source_failed)
  set isdiff = 0
  set sflag = 0
  foreach t2 ($dest_failed)
    if ($t2 == $t) then
      set sflag = 1
      break
    endif
  end
  ...
end

Проблема в том, что внутренний цикл foreach работает нормально в течение первых 10 итераций. После этой итерации вдруг я получил

foreach: no match

Более того, я перебираю массив строк, а не файлов. В чем причина этой ошибки?

1 ответ

Проблема (вероятно) в том, что mine.log и / или their.log содержат специальные символы-заглушки, такие как * или же ?, Оболочка попытается развернуть это в файл. Для этого случайного шаблона нет совпадений, и, следовательно, возникает ошибка "нет совпадений".

Самый простой способ предотвратить такое поведение - добавить set noglob наверх От tcsh(1):

    noglob  If set, Filename substitution and Directory stack  substitution
           (q.v.)  are  inhibited.   This  is most useful in shell scripts
           which do not deal with filenames, or after a list of  filenames
           has been obtained and further expansions are not desirable.

Вы можете повторно включить это поведение, используя set glob,

Альтернативно, вы можете использовать :q, От tcsh(1):

Unless  enclosed in `"' or given the `:q' modifier the results of variable
substitution may eventually be command and  filename  substituted.

[..]

When the `:q' modifier is applied to a substitution the variable will expand
to multiple words with  each  word  sepa rated  by  a blank and quoted to
prevent later command or filename sub stitution.

Но вы должны быть очень осторожны при цитировании, когда используете переменную. В приведенном ниже примере echo Команда не будет выполнена, если вы не добавите кавычки (set noglob is much easier):

set source_failed = `cat source`

foreach t ($source_failed:q)
    echo "$t"
end
Другие вопросы по тегам