2017-02-04 16 views
0

テキストファイルを読み込むスクリプトを作成しようとしていて、 "run"または "chk"という単語で始まるすべての行をコマンドとして実行しようとしています。これは私がこれまで持っているものです。テキストファイルからbashスクリプトを使ってコマンドを実行する

#!/bin/bash 
counter=1 
for i in [email protected] 
do 
    while read -r line 
    do 
    if [[ ${line:0:4} == "run " ]] 
    then 
     echo "Now running line $counter" 
     ${line:4:${#line}} 
    elif [[ ${line:0:4} == "chk " ]] 
    then 
     echo "Now checking line $counter" 
     ${line:4:${#line}} 
    elif [[ ${line:0:2} == "# " ]] 
    then 
     echo "Line $counter is a comment" 
    else 
     echo "Line $counter: '$line' is an invalid line" 
    fi 
    counter=$((counter+1)) 
    done<$i 
done 

しかし、私はそれを持つテキストファイルを供給する場合、例えば

run echo > temp.txt 

コマンドは、それが実際にTEMP.TXTというファイルを作成しません、それは単に "> temp.txt"をstdoutに返します。私は

run program arguments > filename.txt 

ような何かをしようとしたとき、私が望むように、それはまた同じようなことは、これは、ファイル内のプログラムの出力を入れていないんが、それはむしろ、ファイル名として「>」を処理しようとします。

私はこれが超特有でおそらく明白なことだと知っていますが、私はbashとすべてのシェルスクリプトについて非常に新しいです。あなたは、変数のすべての通常のシェルの構文解析を行うためにevalを使用する必要が

おかげ

+1

変数の展開時に、ほとんどの特殊文字は処理されません。通常のシェル解析を行うには、 'eval'を使う必要があります。 – Barmar

+0

は、部分文字列をコマンドとして登録しますか? –

+0

'eval'は通常のシェルコマンドと同じように文字列を実行します。 – Barmar

答えて

1

eval "${line:4}" 

また:${#line}を必要としません。長さを省略すると、デフォルトで残りの文字列になります。

+0

'eval'が引数の引用や潜在的展開に関して何をするのかについてコメントすることは有益かもしれません。 – Fred

+0

@Fredスクリプト自体にある場合とまったく同じように扱います。 – Barmar

+0

私はそれが理にかなっています。ありがとうございます –

関連する問題