Случайный случай
Это для кода:
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