从包含多个脚本的文件(shell / perl)运行特定脚本

时间:2012-04-13 10:36:31

标签: shell

假设我有一个文件(.csh)

文件内容

Script_1
{
 code of script1
}

Script_2
{
    code of script2
 }
.
.
.

Script_n
{

 code of script_n

}

现在问题是,如果我们像

一样运行
 ./file.csh -script1 <other arguments>

它应该只执行脚本1代码 同样明智的,如果我们运行

./file.csh  -script2 <other arguments>

它应该只执行脚本2代码

任何人都能说出如何实现这个目标吗?

2 个答案:

答案 0 :(得分:1)

您可以通过$n获取命令行参数,其中n是整数&gt; 0按顺序传递参数

#!/bin/csh
if ($#argv < 1) then
    echo "Usage: $0 (-script1|-script2) <args>"
    exit 0
endif

if ($1 == '-script1') then
# run Script_1
else
# run Script_2
endif;

如果您想将除第一个之外的所有参数放在一起,您可以使用shift

#!/bin/csh

// without argument by default operates on $argv which is all the arguments 
// passed via command line
shift 

echo $argv // now contains all arguments but the first

答案 1 :(得分:1)

这是我的解决方案,希望它会有所帮助。

使用all_script文件存储所有内容。 我的示例文件内容是:

Script_1
{
 echo executing script1
 echo 1st arg = $1
 echo 2nd arg = $2
 echo rest arg = $*
}

Script_2
{
 echo script2  
 echo 1st arg = $1
 echo 2nd arg = $2
 echo rest arg = $*

}

Script_3
{
echo script3
 echo 1st arg = $1
 echo 2nd arg = $2
 echo rest arg = $*
}

我的脚本运行:

#! /bin/csh -f


set script_name = `echo $argv[1] | sed 's/-s/S/g' | sed 's/t/t_/g'`
set script_arg =  "$argv[2-$#argv]"  

#grep the relevent script
grep -A1000 $script_name all_script | grep -B1000 -m1 "}" | sed 's/Script_[0-9]//g' | sed 's/{//g' | sed 's/}//g' > myscript 
csh ./myscript $script_arg

echo "DONE :)"

根据脚本的最大长度更改数字1000。 另外,请注意您已将Script_1用作文件中的脚本名称。当你试图用参数-script1访问它时。我的脚本会处理这个问题,但是最好使用其中一种格式,并且情况也应该是统一的...否则你将会邀请不必要的复杂性。