2016-08-11 5 views
0

私はUnix/Linuxシェルスクリプトnewbieです。以下の行を含むスクリプトを見てください。この質問の以下の詳細はあいまいですが、このコードを書いた人は文書を残さず、その後解読しています。誰でも実際に何をしているのかアドバイスできますか?これらのUnix/Linuxのラインは何をしていますか?

特定のコードが2つあります。シェルスクリプトが実行する計算を行うには様々なパラメータを、私が思うに、代表

failure="020o 040a" 
success="002[a-d] 003[a-r] 004[a-s] 005[a-u] 

:最初は、単にラインpolys.shは、内容のテキストファイルですsource polys.shです。計算の性質は重要ではないと言われています。なぜなら、目的はスクリプトを実行させることだけだからです。

2番目のコードは以下の通りで、関連する行はStartStopというコメントで区切られています。私が言えることは、$arg1が空白の場合、$opt1も空白の場合、$polyはテキストファイルのパスと名前であり、./search私はフォルダであると信じています。

if [ $search == "yes" ] 
    then 
     # Search stage for squares containing zeros 
     # 

     # Start. 

     output="$outputs/search/"`basename $poly` 
     ./search $opt1 $arg1 < $poly 2>&1 | tee $output 
     if tail -n1 $output | grep -v "success" 

     # End. 

     then 
     echo "SEARCH FAILURE" >> $output 
     continue 
     fi 
     # Save approximations 
     # 
     echo -n "SEARCH SUCCESS " >> $output 
     cat /tmp/iters >> $output 
     cp /tmp/zeros $inputs/search/`basename $poly` 
    else 
     echo "No search" 
    fi 
+0

が含まれていますその意図は明らかです(前述のバグはないかもしれませんが)。 –

+0

http://shellcheck.netが示すすべてのバグを修正し、残っているものだけに焦点を当てて質問してください。 –

+0

(http://shellcheck.net/も見つからないという問題もありますが、POSIX仕様では '[] 'で' = '文字列比較演算子として;それは明示的に定義されていない' echo -n'をエコーのためのPOSIX仕様に従って記述しておらず、明示的な書式文字列を優先置換とした 'printf'を持っていますが、 *は識別するのが良い場所です)。 –

答えて

1

EDIT氏チャールズ・ダフィーの助言として初期免責事項:

以下の説明は、あなたが拡張関連のバグをヒットしないだろうと想定。これらの説明が正しい

  • source polys.shが故にちょうど(それをソースファイルと同じフォルダ内のファイルでスクリプトpolys.shからのコードが含まれていることを保証するためにshellcheck.netの助言として、あなたのコードを修正してくださいファイル名、パスなし)。そのファイル内
  • failure="020o 040a" 
    success="002[a-d] 003[a-r] 004[a-s] 005[a-u]" 
    

    は、2つの変数の宣言です。変数$failure"020o 040a"$success"002[a-d] 003[a-r] 004[a-s] 005[a-u]"に設定されています。ファイルがsource dだったので、これら2つの変数はスクリプトで使用できます(echo "$failure"echo "$success"を参照してください)。

  • output="$outputs/search/`basename $poly`"を説明するための2つの部分を有する:

    "$outputs/search/" 
    

    文字列"/search/"によって添付変数$outputsの値に、すなわち、"$outputs/search/"に可変$outputを設定し、

    `basename $poly` 
    

    を。バッククォート内の何かはコマンド置換であり、その出力を返すコマンドを解釈して実行し、コマンドbasename $polyはベースファイルを取得するか、 $polyからのフォルダ名、ファイルパスの場合はbasename $polypoly="/dev/file.txt"の場合はfile.txt)です。出力は文字列として追加されます。 "$outputs/search/"

  • ./search $opt1 $arg1 < $poly 2>&1 | tee $outputは、パイプ|で区切られた2つのコマンドです:

    ./search $opt1 $arg1 < $poly 2>&1 
    

    は二つの引数、$opt1$opt2変数と実行ファイル./searchを(./は、現在のスクリプトのディレクトリの省略形です)を実行します。 $polyはファイルパスを表すべき変数名であり、ファイルパスの内容はコマンドにリダイレクトされます(<を使用)。すべてのエラー(stderr2)の出力は、標準出力(stdoutまたは&2)にリダイレクトされます。アンパサンドはファイル記述子でありファイルパスではないことを表します。そうでない場合は、出力を2というファイルにリダイレクトします。 )。

    tee $output 
    

teeパイプ出力stdoutに、ファイルパスなどの引数にstdin。したがって、tee "/home/nick/output"stdin"/home/nick/output"のファイルに保存し、stdoutも保存します。

  • if tail -n1 $output | grep -v "success"

    tail -n1 $output 
    

    "$出力" 変数の値で、ファイルの最後の行を取得します。最後の行が"fail"であれば、それはしないように、ライン(中"success"tail -n1から最後の行のいずれかの非一致の

    grep -v "success" 
    

    検索は(-vが試合を反転)例えば、それはif文を渡します意図*と*時間とテキストのかなりを取るバグの両方を説明し、その場所の多くの部分がある - このコードのスニペットのバグの多くは実際にあります"success"

+0

ここでは、ファイル名が空白(空白やグロブ文字は含まれていません)、IFSがデフォルト値などであることを前提としています。つまり、作成者が*このコードの目的とは何かを記述しています。実際に実行すると保証されています。 –

+0

@CharlesDuffyこれはコードとコマンドの説明であり、その品質に関する解説はありません。 –

+0

確かに、考えられる行動を排除すれば本当に説明になりますか? 「これはXです」は、コードが実際にXを実行することが保証されている場合に限り、完全に真実な文です。 –

関連する問題