Вопрос сценария оболочки - PullRequest
       16

Вопрос сценария оболочки

0 голосов
/ 16 сентября 2010

Я хочу выполнить следующую команду в сценарии оболочки

cp /somedire/*.(txt|xml|xsd) /destination/dir/

Но это не выполняется внутри сценария оболочки.Любая быстрая помощь?

createjob.sh: строка 11: синтаксическая ошибка рядом с неожиданным токеном `('

Моя оболочка - zsh.

Спасибо, Найн

Ответы [ 3 ]

2 голосов
/ 16 сентября 2010

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

Если вы хотите продолжать использовать эту конструкцию, вам придется вызывать zsh как zsh (предположительно, заменив #!/bin/sh на * 1004).* или что-то подобное).

Если вам нужен скрипт для запуска на ksh, используйте #!/bin/ksh или #!/usr/bin/env ksh и

cp /somedire/*.@(txt|xml|xsd) /destination/dir/

Если вам также нужна поддержка bash, тота же команда с @ будет работать при условии, что вы сначала выполните следующие команды:

shopt -s extglob 2>/dev/null  ## tell bash to parse ksh globbing extensions
setopt ksh_glob 2>/dev/null   ## tell zsh to parse ksh globbing extensions

Если вам нужна совместимость с POSIX sh, вам придется использовать три отдельные команды и подготовить сообщение об ошибке, еслини одно из трех расширений не имеет соответствия.Более надежное решение будет использовать find:

find /somedire -name /somedire -o -type d -prune -o \
     \( -name '*.txt' -o -name '*.xml' -o '*.xsd' \) \
     -exec sh -c 'cp "$@" "$0"' /destination/dir {} +
0 голосов
/ 17 сентября 2010

Это будет работать в bash и, вероятно, в zsh: cp /somedire/*.{txt,xml,xsd} /destination/dir/

Это не в POSIX , так что он не будет работать с большинством /bin/sh.

0 голосов
/ 16 сентября 2010

Понятия о zsh нет, но Bash не знает о регулярных выражениях в путях, только о подстановочных знаках.

Вы можете попробовать использовать find:

find -E . -regex '.*\.(txt|xml|xsd)' -exec cp {} /destination/dir \;

Посмотрите наman для объяснения синтаксиса find.

...