2016-12-15 2 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 

, но если я обед сценарий «./script.sh Nastran» есть ошибка: ./ lancia.sh: строка26: PBS_nastran: команда не найдена Я думаю, что проблема заключается в интерпретации пустого пространства, но я не понимаю, как это исправить. Благодарим за помощь

+0

два вопроса: (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

Спасибо за ваш ответ. Я пробую ваши предложения, но, к сожалению, проблема остается –