首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Shell脚本问题

Shell脚本问题
EN

Stack Overflow用户
提问于 2010-09-17 03:10:47
回答 3查看 488关注 0票数 0

我想在shell脚本中执行以下命令

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

但这不能在shell脚本中运行。有什么快速帮助吗?

createjob.sh:第11行:意外标记`(‘’附近的语法错误

我的shell是zsh。

谢谢Nayn

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-17 03:58:02

括号和交替的使用是特定于zsh的构造。它在其他shell中不起作用,包括sh兼容模式下的zsh。

如果您想继续使用这种构造,就必须以zsh的形式调用zsh (大概是用#!/bin/zsh或类似的东西替换#!/bin/sh )。

如果需要在ksh上运行脚本,请使用#!/bin/ksh#!/usr/bin/env ksh

代码语言:javascript
复制
cp /somedire/*.@(txt|xml|xsd) /destination/dir/

如果您还需要支持bash,则可以使用@执行相同命令,前提是您首先运行以下命令:

代码语言:javascript
复制
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:

代码语言:javascript
复制
find /somedire -name /somedire -o -type d -prune -o \
     \( -name '*.txt' -o -name '*.xml' -o '*.xsd' \) \
     -exec sh -c 'cp "$@" "$0"' /destination/dir {} +
票数 2
EN

Stack Overflow用户

发布于 2010-09-17 03:15:00

不知道zsh,但是Bash不知道路径中的正则表达式,只知道通配符。

您可以尝试使用find

代码语言:javascript
复制
find -E . -regex '.*\.(txt|xml|xsd)' -exec cp {} /destination/dir \;

查看手册页,了解find语法的解释。

票数 0
EN

Stack Overflow用户

发布于 2010-09-17 04:05:50

这将在bash中工作,可能在zsh中也有效:cp /somedire/*.{txt,xml,xsd} /destination/dir/

不过,它不是POSIX版本,所以它不能在大多数/bin/sh上运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3729908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档