0

ac プログラムでシェル プログラムを作成しようとしています。基本的に、同じシェルコマンドが何度も繰り返されているが、一部が変更されているテキストファイルが必要です。1 から 750 までカウントし、その 1 桁を変更して段落を出力する C プログラムを作成しようとしましたが、シェル コマンドを読み取ろうとしてエラーが発生しました。シェル コマンドを無視して、printf の内容を出力するにはどうすればよいですか?

プログラムは次のとおりです。

#include <stdio.h>

int main ()
{
    int x;
    for(x=1;x<751;x++){
        printf("#!/bin/sh");
        printf("NRNHOME="/Applications/NEURON-7.3/nrn"");
        printf("\NEURONHOME="${NRNHOME}/share/nrn"");
        printf("CPU=i386");
        printf("NRNBIN="${NRNHOME}/i386/bin/"");
        printf("PATH="${NRNHOME}/i386/bin:${PATH}"");
        printf("export NRNHOME");
        printf("export NEURONHOME");
        printf("export NRNBIN");
        printf("export PATH");
        printf("export CPU");
        printf("nrncarbon=yes");
        printf("export nrncarbon");
        printf("cd "\${NRNHOME}/i386/bin"");
        printf("./nrngui.sh "/Applications/NSD2013/s%d.hoc"\n\n",x);
    }
}

すべてのディレクトリが宣言されておらず、 $? の前に ) が必要であることがわかります。私が望むのは、s1.hoc で始まり s750.hoc で終わる最後の行で、.hoc ファイルを変更するコマンドを出力することだけです。

アドバイスをいただきありがとうございます。

4

3 に答える 3

3

あなたのプログラムは、おそらく 750 の別々のスクリプトファイルに分割しなければならない、ほぼ同じスクリプトの 750 回の比較的役に立たない長い出力リストを生成するという事実は別として、誤動作の原因となる具体的な問題がいくつかあります。

    printf("#!/bin/sh");
  1. このステートメントはループ内にあるため、次のようになります。
  2. printf はそれ自体では改行を追加しません\n。次の printf を新しい行で開始する場合は追加します

    printf("\NEURONHOME="${NRNHOME}/share/nrn"");
    
  3. \N最初は意図的ではないことは確かです

  4. 文字列内の二重引用符はエスケープする必要があります。\"

    printf("cd "\${NRNHOME}/i386/bin"");
    

ここで $ をエスケープしているように見える理由がわかりません...

    printf("./nrngui.sh "/Applications/NSD2013/s%d.hoc"\n\n",x);
}

とにかく、純粋なシェルスクリプトでこれを行うのは非常に簡単で、出力を 750 の異なるスクリプト ファイルに 1 回で送信できます。

for i in {1..750}  ; do
cat << EOT > the_output_script$i.sh
#!/bin/sh
NRNHOME="/Applications/NEURON-7.3/nrn"
...      
# If you want bash to ignore variables that should be evaluated later on
# you just need to escape the dollarsign
NRNBIN="\${NRNHOME}/i386/bin/"
./nrngui.sh "/Applications/NSD2013/s$i.hoc
EOT
# we're after the end of the heredoc, so here we can add other stuff that
# needs to be done in the loop, like changing the file's access:
chown ug+x the_output_script$i.sh
done

これにより、the_output_script1.sh から the_output_script750.sh という名前の 750 個のファイルが生成されます。これは、あなたが本当に探しているものだと思います。ところで、このスクリプトで使用されるコア トリックは、ヒアドキュメントまたはヒア ドキュメントと呼ばれます。

于 2013-07-03T17:39:08.463 に答える
1

わかりました、元の意図を維持するために(教育目的のみ):

#include <stdio.h>

int main ()
{
    int x;

    for(x=1;x<751;x++) {
        printf("#!/bin/sh\n");
        printf("NRNHOME=\"/Applications/NEURON-7.3/nrn\"\n");
        printf("NEURONHOME=\"${NRNHOME}/share/nrn\"\n");
        printf("CPU=i386");
        printf("NRNBIN=\"${NRNHOME}/i386/bin/\"\n");
        printf("PATH=\"${NRNHOME}/i386/bin:${PATH}\"\n");
        printf("export NRNHOME");
        printf("export NEURONHOME");
        printf("export NRNBIN");
        printf("export PATH");
        printf("export CPU");
        printf("nrncarbon=yes");
        printf("export nrncarbon");
        printf("cd \"${NRNHOME}/i386/bin\"\n");
        printf("./nrngui.sh \"/Applications/NSD2013/s%d.hoc\"\n\n",x);
    }
}

さて、それを行う別の方法は(my_script.sh)です:

#!/bin/sh
NRNHOME=/Applications/NEURON-7.3/nrn
NEURONHOME=${NRNHOME}/share/nrn
CPU=i386
NRNBIN=${NRNHOME}/i386/bin/
PATH=${NRNHOME}/i386/bin:${PATH}
export NRNHOME
export NEURONHOME
export NRNBIN
export PATH
export CPU
nrncarbon=yes
export nrncarbon
cd ${NRNHOME}/i386/bin
./nrnqui.sh /Applications/NSD2013/s*.hoc // the lazy way

OR: my_script.sh: // for ループあり

#!/bin/sh
NRNHOME=/Applications/NEURON-7.3/nrn
NEURONHOME=${NRNHOME}/share/nrn
CPU=i386
NRNBIN=${NRNHOME}/i386/bin/
PATH=${NRNHOME}/i386/bin:${PATH}
export NRNHOME
export NEURONHOME
export NRNBIN
export PATH
export CPU
nrncarbon=yes
export nrncarbon
cd ${NRNHOME}/i386/bin
for i in {1..750}
do
    ./nrnqui.sh /Applications/NSD2013/s{$i}.hoc
done
于 2013-07-03T17:39:05.753 に答える
0

これならできる、

#include <stdio.h>

int main ()
{
    int x;
    for(x=1;x<751;x++){
        printf("#!/bin/sh\n");
        printf("NRNHOME=\"/Applications/NEURON-7.3/nrn\"\n");
        printf("NEURONHOME=\"${NRNHOME}/share/nrn\"\n");
        printf("CPU=i386\n");
        printf("NRNBIN=\"${NRNHOME}/i386/bin/\"\n");
        printf("PATH=\"${NRNHOME}/i386/bin:${PATH}\"\n");
        printf("export NRNHOME\n");
        printf("export NEURONHOME\n");
        printf("export NRNBIN\n");
        printf("export PATH\n");
        printf("export CPU\n");
        printf("nrncarbon=yes\n");
        printf("export nrncarbon\n");
        printf("cd \"${NRNHOME}/i386/bin\"\n");
        printf("./nrngui.sh \"/Applications/NSD2013/s%d.hoc\"\n\n",x);
    }
}

printf ここで学ぶことを強くお勧めします。言語について知るには、ここにあるソースを参照してください

于 2013-07-03T17:36:46.343 に答える