2010-09-16 192 views
0

我想在shell腳本shell腳本問題

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

執行下面的命令,但這並不shell腳本內運行。任何快速幫助?

createjob.sh:第11行:附近意外的標記語法錯誤'(」

我的殼是zsh的

感謝 Nayn

+0

該腳本是否也由zsh執行? – ngroot 2010-09-16 19:13:50

+0

該命令在zsh中執行得很好。但是在shell腳本里面它只有一個嬰兒牀 – Nayn 2010-09-16 19:15:53

回答

2

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

如果你想繼續使用這個構造,你必須調用zsh作爲zsh(大概是用#!/bin/sh代替#!/bin/zsh或類似的東西)。

如果您需要腳本在ksh的運行,使用#!/bin/ksh#!/usr/bin/env ksh

cp /somedire/*[email protected](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 /somedire -name /somedire -o -type d -prune -o \ 
    \(-name '*.txt' -o -name '*.xml' -o '*.xsd' \) \ 
    -exec sh -c 'cp "[email protected]" "$0"' /destination/dir {} + 
0

有關的zsh不知道,但擊不知道。正則表達式中的路徑,只有通配符

您可以嘗試使用find

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

查看關於find的語法解釋的聯機幫助頁。

+0

'*。(txt | xml | xsd)'是zsh中的一個shell模式,它意味着你的想法。請注意,'-E'不是標準的(它似乎特定於FreeBSD)。你的命令與原來的不同之處在於它遞歸到子目錄中。 – Gilles 2010-09-16 20:04:01

+0

@Gilles:'-E'確實是非標準的,但如果沒有它,使用Unix命令('sed','grep' ...)是* ss中的一個真正的痛苦,因爲你得到的只是上一個千年的正則表達式版本。 – 2010-09-17 07:23:43

0

這將在bash工作,可能的zsh還有:cp /somedire/*.{txt,xml,xsd} /destination/dir/

這不是在POSIX,雖然如此,它不會與大多數/bin/sh的工作。

+0

當且僅當存在和txt,xml和xsd文件時,它纔會起作用,而'(|)'版本只有在沒有帶有這種擴展名的文件時纔會失敗。 – ZyX 2010-09-16 20:57:20

+0

所以,如果有_are_文件,其他工作,如果沒有文件,其他失敗......我不明白你指出的差異。 – 2010-09-17 06:21:53

+0

如果存在例如* .txt和* .xml文件,但沒有* .xsd文件,則您的命令應該失敗。取決於shell選項,它可能會離開'/ somedire/*。xsd'模式(如bash),沒有任何東西(在這種情況下,它的作用類似於'(|)'版本)(使用'nullglob'選項),或者拒絕運行帶'no matches found'錯誤的命令(默認爲zsh)。 – ZyX 2010-09-20 20:51:54