29

私はUNIXプログラミング(ターミナル経由でMacOSX Mountain Lionで実行)に非常に慣れていません。私は、バイオインフォマティクスと分子手法のコース (2 つのクラスがありました) で基本を学んでおり、最終的にデータ管理の目的で perl と python を使用する予定です。とにかく、ファイルのグループからデータを取得し、それを特定のプログラム (Migrate-N) で読み取ることができる形式で新しいファイルに書き込むシェル スクリプトを作成する必要があります。

コマンドラインに入力すると、必要なことを個別に実行するための関数がいくつかありますが、それらをすべてスクリプトにまとめて実行しようとすると、エラーが発生します。詳細は以下の通りです(長文で申し訳ありません)。

#! /bin/bash

grep -f Samples.NFCup.txt locus1.fasta > locus1.NFCup.txt
grep -f Samples.NFCup.txt locus2.fasta > locus2.NFCup.txt
grep -f Samples.NFCup.txt locus3.fasta > locus3.NFCup.txt
grep -f Samples.NFCup.txt locus4.fasta > locus4.NFCup.txt
grep -f Samples.NFCup.txt locus5.fasta > locus5.NFCup.txt
grep -f Samples.Salmon.txt locus1.fasta > locus1.Salmon.txt
grep -f Samples.Salmon.txt locus2.fasta > locus2.Salmon.txt
grep -f Samples.Salmon.txt locus3.fasta > locus3.Salmon.txt
grep -f Samples.Salmon.txt locus4.fasta > locus4.Salmon.txt
grep -f Samples.Salmon.txt locus5.fasta > locus5.Salmon.txt
grep -f Samples.Cascades.txt locus1.fasta > locus1.Cascades.txt
grep -f Samples.Cascades.txt locus2.fasta > locus2.Cascades.txt
grep -f Samples.Cascades.txt locus3.fasta > locus3.Cascades.txt
grep -f Samples.Cascades.txt locus4.fasta > locus4.Cascades.txt
grep -f Samples.Cascades.txt locus5.fasta > locus5.Cascades.txt

echo 3 5 Salex_melanopsis > Smelanopsis.mig
echo 656 708 847 1159 779 >> Smelanopsis.mig
echo 154 124 120 74 126 NFCup >> Smelanopsis.mig
cat locus1.NFCup.txt locus2.NFCup.txt locus3.NFCup.txt locus4.NFCup.txt locus5.NFCup.txt >> Smelanopsis.mig
echo 32 30 30 18 38 Salmon River >> Smelanopsis.mig
cat locus1.Salmon.txt locus2.Salmon.txt locus3.Salmon.txt locus4.Salmon.txt locus5.Salmon.txt >> Smelanopsis.mig
echo 56 52 24 29 48 Cascades >> Smelanopsis.mig
cat locus1.Cascades.txt locus2.Cascades.txt locus3.Cascades.txt locus4.Cascades.txt locus5.Cascades.txt >> Smelanopsis.mig

一連の grep は、各遺伝子座の各サイトの DNA 配列データを新しいテキスト ファイルに引き出しているだけです。Samples...txt ファイルにはサイトのサンプル ID 番号があり、.fasta ファイルにはサンプル ID ごとに編成された配列情報があります。個別に実行すると、コマンドラインでgreppingがうまく機能します。

コードの 2 番目のグループは、最終的に必要な実際の新しいファイルを作成し、.mig で終わります。エコー ラインは、プログラムが情報を必要とするカウント (遺伝子座ごとの塩基対、分析における集団、サイトごとのサンプルなど) に関するデータです。cat 行は、echo 行で指定されたサイト固有の情報の下にあるすべての grep によって作成された、サイト データごとの遺伝子座をマッシュアップします。あなたは間違いなく写真を手に入れます。

シェル スクリプトを作成するために、私は Excel で始めていたので、セルを簡単にコピーして貼り付け/自動入力し、タブ区切りのテキストとして保存し、TextWrangler でそのテキスト ファイルを開いて、.sh ファイルとして保存する前にタブを削除できます (行改行: Unix (LF) およびエンコード: Unicode (UTF-8)) は、スクリプトで使用されるすべてのファイルと同じディレクトリにあります。chmod +x FILENAME.shandを使用しchmod u+x FILENAME.shて、実行可能であることを確認しようとしましたが、役に立ちませんでした。スクリプトを 1 行の grep 行 (#! /bin/bash の最初の行) に切り詰めたとしても、それを機能させることはできません。これらのファイルはいずれも 160KB を超えておらず、一部のファイルは非常に小さいため、このプロセスはコマンド ラインに直接入力するだけで完了します。これは私が入力したものであり、ファイルを実行しようとすると得られるものです (HW は正しいディレクトリです)

localhost:HW Mirel$ MigrateNshell.sh
-bash: MigrateNshell.sh: command not found

私は 2 日間この行き詰まりに陥っているので、どんな意見でも大歓迎です! ありがとう!!

4

12 に答える 12

45

セキュリティ上の理由から、シェルは (デフォルトでは) 現在のディレクトリで実行可能ファイルを検索しません。bash具体的に、スクリプトが現在のディレクトリ ( .)にあることを伝える必要があります。

$ ./MigrateNshell.sh
于 2013-05-13T19:55:18.883 に答える
23

Marc B の指摘に従って、最初の行を次のように変更します。

#!/bin/bash 

次に、スクリプトを実行可能としてマークし、コマンドラインから実行します

chmod +x MigrateNshell.sh
./MigrateNshell.sh

または、スクリプトをパラメーターとして渡してコマンドラインから bash を実行するだけです。

/bin/bash MigrateNshell.sh
于 2013-07-20T04:32:43.187 に答える
16

「PATH」を変数として使用していないことを確認してください。これにより、環境変数の既存の PATH が上書きされます。

于 2015-09-21T11:05:50.770 に答える
10

またdos2unix、シェル スクリプトを試してみてください。Windows の行末があり、シェルがそれを認識しない場合があるためです。

$ dos2unix MigrateNshell.sh

これは時々役立ちます。

于 2013-12-10T11:46:17.413 に答える
4

試すchmod u+x MigrateNshell.sh

于 2016-01-15T02:29:22.457 に答える
2

スクリプトの先頭にシバン行を追加することについて、いくつかの良いコメントがありました。移植性を高めるために、 env コマンドも使用することをお勧めします。

#!/bin/bashシステム上の正しい場所かもしれませんが、それは普遍的ではありません。さらに、それはユーザーの好みのbash ではない可能性があります。 #!/usr/bin/env bashパスで見つかった最初の bash が選択されます。

于 2015-01-12T16:57:28.960 に答える
2
#! /bin/bash
  ^---

指定されたスペースを削除します。シバンは

#!/bin/bash
于 2013-05-13T19:28:29.247 に答える
0

また、/bin/bash が bash の適切な場所であることを確認してください ....どこかの例からその行を取得した場合、特定のサーバーと一致しない可能性があります。bash に無効な場所を指定すると、問題が発生します。

于 2013-10-28T17:07:23.257 に答える
0

.profile パスに以下の行を追加します

PATH=$PATH:$HOME/bin:$Dir_where_script_exists

export PATH

これで、スクリプトがなくても動作するはずです./

ラジ・ダグラ

于 2014-07-31T23:46:50.350 に答える
-1

私もシェルスクリプトは初めてですが、同じ問題がありました。スクリプトの最後に空白行があることを確認してください。それ以外の場合は機能しません。

于 2018-10-15T21:04:15.987 に答える
-4

初め:

chmod 777 ./MigrateNshell.sh

それで:

./MigrateNshell.sh

または、$PATH 変数で認識されるディレクトリにプログラムを追加します。例: パス変数の例./

于 2013-06-28T20:11:19.577 に答える