Проблема с подстановочными знаками в аргументах функции Bash - PullRequest
0 голосов
/ 19 февраля 2020

Из следующей ссылки я попытался использовать следующее решение для сравнения группы исходных файлов (здесь fortran90 = * .f90).

Чтобы сделать это и посмотреть источник которые отличаются, я положил в мой ~ / .bashr c:

function diffm { for file in "$1"/"$2"; do diff -qs "$file" "$3"/"${file##*/}"; done ;}

Но, к сожалению, если я нахожусь в текущем каталоге для аргумента $1, то есть с помощью execute:

$ diffm . '*.f90' ../../dir2

Результат: impossible to access to './*.f90'. Однако источники *.f90 существуют, но подстановочные знаки не учитываются.

Конечно, проблема с двойными кавычками в аргументах моей функции ($1, $2, $3)?

В более общем смысле эта функция не работает должным образом.

Как я могу изменить эту функцию, чтобы она работала во всех случаях, даже находясь в текущем каталоге "." для первого аргумент $1 или третий $3?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Если я понял, что вы пытаетесь сделать, это должно сработать

diffm () {
    dir="$1"; shift
    for file in "$@"; do
        filename=$(basename "$file")
        diff -qs "$file" "$dir/$filename"
    done
}

Использование

diffm ../../dir2 ./*.f90
1 голос
/ 19 февраля 2020

Генерация имени файла не происходит в кавычках. Следовательно, вы передаете литеральную строку *.f90 в функцию, и эта строка также используется там буквально. Если вы точно знаете, что в вашем каталоге ровно один файл f90, не используйте кавычки и пишите

diffm . *.f90 ../../dir2

Все становится ужасно, если в имени файла есть пробел (который, кстати, один причина, по которой я предпочитаю Zsh вместо bash - вам не нужно заботиться об этом в Zsh). Чтобы разобраться с этим делом, вы можете сделать

myfile=*.f90
diffm . "$myfile" ../../dir2

Но рано или поздно вас укусит тот факт, что по какой-то причине у вас есть более одного файла f90, и ваша стратегия сломается , Следовательно, лучшим решением было бы использовать al oop, который также работает для случая границы, когда имеется только один файл:

iterating=0
for myfile in *.f90
do
    if ((iterating == 0))
    then
      ((iterating+=1))
      diffm . "$myfile" ../../dir2
    elif [[ ! -f $myfile ]]
    then
      echo "No files matching $myfile in this directory"
    else
      echo "ERROR: More than one f90-file. Don't know which one to diff" 1>&2
    fi
done

Часть elif просто заботится о случае, который вы не делаете. У меня нет файлов f90. В этом случае тело l oop выполняется один раз, а myfile содержит шаблон подстановки.

...