您好我正在创建一个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:找不到命令 我认为问题在于对空白的解释,但我不了解修复它的方法。 谢谢你的帮助
答案 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