首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由bash脚本文件调用的Eval

由bash脚本文件调用的Eval
EN

Stack Overflow用户
提问于 2016-12-16 03:14:26
回答 1查看 373关注 0票数 0

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

代码语言:javascript
复制
file1.dat
file2.dat
file3.dat
file1.inp
file2.inp
file3.fal

我必须在shell中输入以下命令

代码语言:javascript
复制
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

我已经创建了一个symple脚本

代码语言:javascript
复制
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文件中,我创建了以下代码

代码语言:javascript
复制
#!/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: command not found我认为问题出在对空格的解释上,但我不明白修复它的方法。感谢您的帮助

EN

回答 1

Stack Overflow用户

发布于 2016-12-16 03:59:42

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

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

代码语言:javascript
复制
#!/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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41171690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档