Shell脚本问题

时间:2010-09-16 19:10:47

标签: unix shell zsh

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

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

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

createjob.sh:第11行:意外令牌附近的语法错误`('

我的shell是zsh。

由于 Nayn

3 个答案:

答案 0 :(得分:2)

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

如果您想继续使用此构造,则必须将zsh调用为zsh(可能是通过#!/bin/sh替换#!/bin/zsh或类似的东西。)

如果您需要在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 {} +

答案 1 :(得分:0)

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

您可以尝试使用find

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

请查看联机帮助页以获取find

语法的说明

答案 2 :(得分:0)

这可以在bash中运行,也可能在zsh中运行:cp /somedire/*.{txt,xml,xsd} /destination/dir/

但它不在POSIX,所以它不适用于大多数/bin/sh