我想在shell脚本中执行以下命令
cp /somedire/*.(txt|xml|xsd) /destination/dir/
但这不能在shell脚本中运行。有什么快速帮助吗?
createjob.sh:第11行:意外标记`(‘’附近的语法错误
我的shell是zsh。
谢谢Nayn
发布于 2010-09-17 03:58:02
括号和交替的使用是特定于zsh的构造。它在其他shell中不起作用,包括sh兼容模式下的zsh。
如果您想继续使用这种构造,就必须以zsh的形式调用zsh (大概是用#!/bin/zsh或类似的东西替换#!/bin/sh )。
如果需要在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 {} +发布于 2010-09-17 03:15:00
不知道zsh,但是Bash不知道路径中的正则表达式,只知道通配符。
您可以尝试使用find
find -E . -regex '.*\.(txt|xml|xsd)' -exec cp {} /destination/dir \;查看手册页,了解find语法的解释。
发布于 2010-09-17 04:05:50
这将在bash中工作,可能在zsh中也有效:cp /somedire/*.{txt,xml,xsd} /destination/dir/
不过,它不是POSIX版本,所以它不能在大多数/bin/sh上运行。
https://stackoverflow.com/questions/3729908
复制相似问题