由bash脚本文件调用的Eval

时间:2016-12-15 19:14:26

标签: bash eval

您好我正在创建一个bash脚本来改善我的工作。如果我在目录中有一些文件,如

file1.dat
file2.dat
file3.dat
file1.inp
file2.inp
file3.fal

我必须在shell中用以下命令数字

PBS_nastran ver=20101 mem=48Gb mod=i8 i=file1.dat
PBS_nastran ver=20101 mem=48Gb mod=i8 i=file2.dat
PBS_nastran ver=20101 mem=48Gb mod=i8 i=file3.dat
PBS_abaqus ver=6133 ncpu=16 j=file1.inp
PBS_abaqus ver=6133 ncpu=16 j=file2.inp
PBS_falancs j=file1.fal

我已经创建了一个简单的脚本

code='nastran'
case $code in 
   abaqus)  command="PBS_abaqus ver=6133 ncpu=16 j="
            ext=".inp";;
   nastran) command="PBS_nastran ver=20101 mem=48Gb mod=i8 i="
            ext=".dat";;
   falancs) command="PBS_falancs j="
            ext=".fal";;
esac
file_list=$(ls * | grep "$ext$")
file_list=${file_list//"./"/}
file_list=$(echo $file_list | tr " " "\n")

for file in $file_list
do 
   command=$command$file
   eval $command
done

这没关系并正常工作。优化过程的下一步是将代码放在* .sh文件中并创建此

#!/bin/bash
case $1 in 
   abaqus)  command='PBS_abaqus ver=6133 ncpu=$3 j='
            ext='.inp';;
   nastran) command='PBS_nastran ver=20101 mem=48Gb mod=i8 i='
            ext='.dat';;
   falancs) command='PBS_falancs j='
            ext='.fal';;
esac
if [ -z $2 ] 
then
   file_list=$(ls | grep -E "[0-9]{8}_[[:alnum:]].*_RUN_[[:alnum:]].*${ext}$")
   file_list=${file_list//"./"/}
   file_list=$(echo $file_list | tr " " "\n")
else
   file_list=$2
fi
for file in $file_list
do 
   command=$command$file
   eval "$command"
done

但如果我午餐脚本" ./ script.sh nastran"有一个错误: ./lancia.sh:line26:PBS_nastran:找不到命令 我认为问题在于对空白的解释,但我不了解修复它的方法。 谢谢你的帮助

1 个答案:

答案 0 :(得分:1)

您应该很少使用eval,这也不例外。您可以将命令 name 存储在变量中,但不应存储整个命令 line 。将参数放在数组中以确保它们保持正确引用。

另外,不要尝试解析ls的输出;使用模式匹配您想要的文件。 (不幸的是,你不能像{8}这样的括号表达式使用模式。)

#!/bin/bash
num_cpus=${3:-1}

case $1 in 
   abaqus)
       cmd_name=PBS_abaqus
       cmd_options=( ver=6133 "ncpu=$num_cpus")
       file_option="j"
       ext='.inp'
       ;;
   nastran)
       cmd_name=PBS_nastran
       cmd_options=( ver=20101 mem=48Gb mod=i8)
       file_option="i"
       ext='.dat'
       ;;
   falancs)
       cmd_name=PBS_falancs
       cmd_options=()
       file_option="j"
       ext='.fal'
       ;;
   *) echo "Unrecognized name '$1', aborting" >&2
      exit 1
esac

if [ -z "$2" ]; then
   file_list=( [[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]][[:digit:]]_[[:alnum:]]*_RUN_[[:alnum:]]*$ext )
else
   file_list=( $2 )  # I'm assuming here $2 is intended to be a pattern
fi
for file in "${file_list[@]}"; do
do 
   "$cmd_name" "${cmd_options[@]}" "$file_option=$file"
done