Печать динамического списка месячных дней по вертикали

Может быть, вы можете настроить oauth?

http://oauth.net/

Также есть реализация для python (как я видел python в тегах): https://github.com/joestump/python-oauth2

В остальном, если бы я мог, я бы проголосовал против этого вопроса, поскольку предоставленной информации недостаточно. Но вы, я полагаю, вам нужно что-то вроде того, что я вам только что предложил

5
06.10.2018, 03:13
4 ответа

В bash задайте параметры glob, чтобы отсутствующие совпадения не вызывали ошибку:

shopt -u failglob  # avoid failure report (and discarding the whole line).
shopt -s nullglob  # remove (erase) non-matching globs.
ls ?c c?

Вопросительный знак -— это символ-шаблон, представляющий один символ. Поскольку вам нужны имена файлов с двумя символами -, одно из них должно быть c, поэтому это либо первый символ, либо последний символ.

С помощью shopt -s dotglobэто также приведет к появлению файла с именем .c.

Если соответствующих файлов нет, установка этих параметров оболочки приводит к удалению всех аргументов, в результате чего по умолчаниюls--отображается пустой список всего/всего.

Вместо этого используйте это:

shopt -s nullglob  ## drop any missing globs
set -- ?c c?       ## populate the $@ array with (any) matches
if [ $# -gt 0 ]    ## if there are some, list them
  ls -d "$@"
fi
15
27.01.2020, 20:31

Думаю, лучше использоватьfind:

find. -type f -name '*c*' -name '??'

Это будет рекурсивный поиск. Чтобы перечислить только файлы в текущем каталоге:

find. ! -name. -prune  -type f -name '*c*' -name '??'
10
27.01.2020, 20:31

Если файлы существуют (и не содержат экранированных символов, таких как \c), вы можете использовать глобус:

echo ?c c?

, который будет соответствовать файлам, имеющим один символ (?), за которым следует c, или которые имеют c, за которым следует один символ(?).

Но произойдет сбой с именами файлов , которые начинаются с тире, например -nили -e, или с символами обратной косой черты, например \cили \nс echoкак -eи -nявляются специальными для (некоторых оболочек)echoи \cили \nбудут интерпретироваться как управляющая последовательность(\cзавершает вывод и \nпечатает новую строку, а не дословные символы \nв некоторых реализациях оболочки эха и с bash, когда установлен параметр shopt -s xpg_echo). Другие приложения или утилиты (, такие как ls), будут иметь некоторые другие параметры и могут дать сбой, если многие другие запущенные тире -или интерпретируют другие escape-символы в именах файлов.

Также дважды будет указан файл с именем cc.

  • Если файл может начинаться с тире (, например -n ), используйте:

    $ ls -d -- ?n 
    -n 
    

    Или, лучше:

    $ ls -d./?n
    ./-n
    

Предостережения

  • Glob не соответствует ни одному файлу.

    1. Если файлы не существуют, глобус не будет расширен, а глобус будет напечатан в исходном виде.

      $ echo ?m m?
      ?m m?
      
    2. Кроме зш.

      $ zsh -c 'echo ?m m?'
      zsh:1: no matches found:./m?
      

      Оболочка завершится с ошибкой.
      Это поведение контролируется параметром Zsh nomatch.

      $ zsh -c 'setopt +o nomatch; echo ?m m?'
      ?m m?
      

      или:

      $ zsh -c 'echo ?m(N) m?(N)'
      ?m m?
      

      Но это напечатает mmдважды.

    3. В bash вы можете получить результат, аналогичный zsh, если установлена ​​опция оболочки failglob:

      $ bash -c 'shopt -s failglob; echo ?m m?'
      bash: no match: ?m
      

      Но скрипт не остановится, оболочка не выйдет. Ну, технически строка, в которой используется глобус, дальше не выполняется, а выполнение возобновляется на следующей строке скрипта.

    4. В bash можно установить параметр nullglobдля удаления несовпадающих глобусов:

      $ bash -c 'shopt -s nullglob; echo ?m m? done'
      done
      
  • Использование ls (аналогично другим программам)

    1. С сопоставлением файлов проблем не будет, но также будут сопоставляться (и список )каталогов:

      $ ls ?c c?
      bc  cz  sc
      
      ac:
      hjk
      

      Лучшее использование -dсls(каталогами будет включено, но не расширено ).

      $ ls -d ?c c?
      ac bc cz sc
      
    2. Глобальные объекты не соответствуют файлу (или каталогу)

      Затем lsсообщит об ошибке

      $ ls ?m m?
      ls: cannot access '?m': No such file or directory
      

      Другие программы могут (возможно )выполнять не аналогичные проверки.

    3. Использование nullglobс bash даст пустой список для ls, поэтому он отобразит содержимое или pwd, как если бы был выполнен только ls:

      $ ls ?m m?
      ac a.out cz 3 b sc ab bc
      

      Этого можно было бы избежать с помощью./

      $ ls -d./?m./m?
      ls: cannot access './?m': No such file or directory
      ls: cannot access './m?': No such file or directory
      

Или вы можете использовать регулярное выражение поиска (, но оно будет проходить по подкаталогам с отсутствующими prune)(Обратите внимание, что это не будет повторять файл с именем cc):

    $ find. ! -name. -prune -regex '.*/\(.c\|c.\)'
   ./ac
   ./cc
   ./sc
   ./bc
   ./cz
3
27.01.2020, 20:31

Вbash:

  • Либо c, за которым следует символ (?c), либо символ (, включающий .с dotglob), за которым следуетc(?c).

    shopt -s extglob failglob dotglob
    printf '%s\n' @(?c|c?)
    
  • Все файлы, кроме тех, которые либо не содержат c(!(*c*)), либо не содержат двух символов(!(??)). Здесь используется двойное -отрицание для достижения соединения.

    shopt -s extglob failglob dotglob
    printf '%s\n' !(!(*c*)|!(??))
    

Вzsh:

  • printf '%s\n' (?c|c?)(D)

    (где Dвключает dotglob; failglob(, называемый nomatchв zsh), по умолчанию включен там ).

  • двойное отрицание с использованием оператора~кроме и ^расширенных операторов отрицания:

    set -o extendedglob
    printf '%s\n' *c*~^??(D)
    

Вksh93:

  • в ksh93 нет опции nomatch/failglob, но там можно сделать вручную:

    FIGNORE='@(.|..)' # only ignore. and.. and not the other dotfiles
    files=(~(N)@(?c|c?))
    if ((${#files[@]})); then
      printf '%s\n' "${files[@]}"
    else
      echo >&2 No match
      exit 1
    fi
    

    (где ~(N)включает nullglobдля этого шара ).

  • ksh93имеет оператор конъюнкции. Так что здесь вы также можете изменить строку files=(...)на:

    files=(~(N)@(*c*&??))
    
3
27.01.2020, 20:31

Теги

Похожие вопросы