2016-12-15 10 views
0

こんにちは私の仕事を改善するためのbashスクリプトを作成しています。私は、このようなevalがbashスクリプトファイルによって呼び出されました

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

としてディレクトリにいくつかのファイルを持っている場合、私はシェル内の数字は、次のコマンド

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スクリプト

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 

が、私の昼食のスクリプトは、「NASTRAN ./script.sh」エラーが発生した場合: ./ lancia.sh:line26:PBS_nastran:コマンドが見つかりません 問題は空白の解釈にあると思いますが、修正方法を理解できません。 ありがとうございました

+0

2つの質問:(1)このファイルには実行権限がありますか? (2)これはWindowsやUnix上で書かれていましたか? –

+0

'eval'を使うときの最初の考えは"私は間違っていますか? " – chepner

+0

シェルスクリプトをデバッグする最良の方法は、スクリプトの先頭に 'set -x'を置くことです。実行中のすべてのコマンドが表示されるので、展開されているすべての変数を見ることができます。 – Barmar

答えて

1

evalを使う必要はほとんどありません。これは例外ではありません。変数の名前をに格納できますが、コマンド全体を格納しないでください。。引数を適切に引用したままにするには、引数を配列に入れます。

また、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 
+0

を使用しました。私はあなたの提案を試みますが、残念ながら問題は残っています –

関連する問題