我想在shell脚本中执行以下命令
cp /somedire/*.(txt|xml|xsd) /destination/dir/
但是这不会在shell脚本中运行。有什么快速帮助吗?
createjob.sh:第11行:意外令牌附近的语法错误`('
我的shell是zsh。
由于 Nayn
答案 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
。