如何将正则表达式作为参数传递给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
答案 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
答案 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模式”)