首页 文章

Shell脚本问题

提问于
浏览
0

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

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

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

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

我的shell是zsh .

谢谢Nayn

3 回答

  • 0

    您对括号和替换的使用是特定于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 {} +
    
  • 2

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

    您可以尝试使用 find

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

    有关 find 语法的说明,请查看联机帮助页 .

  • 0

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

    但它不在POSIX中,因此它不适用于大多数 /bin/sh .

相关问题