将正则表达式作为参数传递给shell脚本

时间:2012-08-11 01:41:33

标签: regex bash shell parameters

如何将正则表达式作为参数传递给shell脚本?

我需要编写一个shell脚本,它将获取参数并将它们提供给unix命令。我想在那里使用正则表达式。这有可能吗?

或重新制定 - 如何使用此命令编写相当于“cp”命令的脚本?

我正在尝试创建一个文件“mycp”

#!/bin/bash -fx
cp $2 $1 

并通过

调用它
mycp myDir "*sh" 

并希望它与“cp * sh myDir”相同。 但由此产生的bash解释是:

+ cp '*sh' myDir
cp: *sh: No such file or directory

3 个答案:

答案 0 :(得分:2)

修订问题

  

我正在尝试创建一个文件“mycp”

#!/bin/bash -fx
cp $2 $1 
     

并通过

调用它
mycp myDir "*sh" 

在这种情况下,你仍然需要eval,但是你会写:

#!/bin/bash -x
eval cp "$2" "$1"

由于您已指定-f选项,因此遇到了问题。 man bash说(部分):

  

分词后,除非设置了-f选项,否则bash会扫描每个单词以查找字符*?[

从脚本的'shebang'(第一行)中删除f


原始问题

鉴于您希望mycp "*sh*" aa对参数进行shell扩展,您可能最终会在脚本中使用eval

eval cp "$@"

然而,使用eval是危险的;它可能导致意想不到的副作用。 "$@"的使用很重要;它保留了参数和空格的数量。不幸的是,使用eval然后撤消,但我们不能拥有一切 - 或者不容易。


很长一段时间(比如1987年 * 到1999年),我用这个脚本作为cp的封面:

:   "@(#)$Id: cp.sh,v 1.3 1997/06/02 21:45:00 johnl Exp $"
#
#   Alternative copy command

case $# in
0)  /bin/cp     ;;
1)  /bin/cp $1 .    ;;
2)  /bin/cp "$@"    ;;
*)  if [ -d `la "$@"` ]
    then    /bin/cp "$@"
    else    /bin/cp "$@" .
    fi;;
esac

它使用一个非常简单的C程序la(用于'最后一个参数')来获取最后一个参数,并检查给定的最后一个参数是否是一个目录。超过99%的时间,如果我输入(偶然)'cp / some / where / sh '而不是cp /some/where/*sh* .,第二个就是我的意思,脚本修复了的东西。我已经有一段时间没用过了;它可能已经进入了上一个千年,但可能在某一时间早些时候我放弃了它。

* 尽管版本字符串显示为“1997”,但代码与1987版本相同。版本1.1和1.2在SCCS下并使用不同的SCCS ID字符串;转换为RCS使它们完全相同。版本1.3将SCCS @(#)命令使用的what标识符字符串恢复为RCS版本处理。所以,剧本很古老 - 1987年,真的。

答案 1 :(得分:1)

试试这个:eval cp $1 $2

Bash reference manual: eval

答案 2 :(得分:1)

如果您要做的只是首先指定目录,请查看GNU cp的-t选项:

alias mycp='cp -t'
mycp mydir *.sh

否则:

mycp() {
  local dir=$1
  shift
  cp "$@" "$dir"
}
mycp mydir *.sh

无论哪种方式,让shell扩展通配符并避免使用eval

(注意,*.sh不是正则表达式,它是shell "pattern",通常称为“glob模式”)