ドキュメントのデフォルト名が競合していますか?

ドキュメントのデフォルト名が競合していますか?

私はRscriptを実行するbashスクリプトを生成するためにEOFを使用しています。 Rscriptはbasename出力ファイル名を指定するために使用します。

bashスクリプトのリストを生成するために使用するときに機能さEOFせることはできませんbasename。エラーメッセージは以下の通りです。それでもbashスクリプトを生成できますが、${AF}表示される2つの場所はすべて空白として表示されます。非常に奇妙な!

bashスクリプトをテストしましたが、動作しているので問題EOFがありますbasename

basenameとどのように使用しますかEOF?それとも代替がありますか?ありがとうございます。

for letter in {A..Z}
      do cat <<- EOF > batch_${letter}.sh
    #!/bin/bash
    module load R/3.5.1
    R_func="/home/dir/R_func"
    TREAT="/home/dir/POP"
    BASE="/home/dir/base"
    OUTPUT="/home/dir/tmp"

    for AF in ${BASE}/${letter}*.txt_step3; do
    Rscript ${R_func}P_tools.R \
    --ptool ${R_func}/P_tools_linux \
    --group ${AF} \
    --treat ${TREAT}/pop_exclude24dup \
    --out ${OUTPUT}/OUT_$(basename ${AF%%_txt_step3})_noregress \
    --binary-target F; done

    EOF
       done

エラーメッセージです。

basename:オペランドがありません。詳細については、「basename --help」を参照してください。

ベストアンサー1

区切り文字を引用符で囲んでいない場合、コマンドの置き換え(たとえば、your$(basename ...)や変数)もこの資料で拡張されます。あなたはその$外だけ$(basename ...)でなく、$内側のすべてから逃げるべきです。

修正されたスクリプトバージョン:

for letter in {A..Z}
        do cat <<- EOF > batch_${letter}.sh
                #!/bin/bash
                module load R/3.5.1
                R_func="/home/dir/R_func"
                TREAT="/home/dir/POP"
                BASE="/home/dir/base"
                OUTPUT="/home/dir/tmp"

                for letter in {A..Z} do {
                for AF in \${BASE}/${letter}*.txt_step3; do
                Rscript \${R_func}P_tools.R \
                --ptool \${R_func}/P_tools_linux \
                --group \${AF} \
                --treat \${TREAT}/pop_exclude24dup \
                --out \${OUTPUT}/OUT_\$(basename \${AF%%_txt_step3})_noregress \
                --binary-target F; done
                }
        EOF
done

これは実際にタブにインデントです。この愚かなWebインターフェイスは、タブを空白に切り替えて<<-POSIXシェルの状況を破る可能性があります。ここでは、文書のスペースと行の前にあるEOF区切り文字ではなく、タブのみを削除します。

おすすめ記事