私は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区切り文字ではなく、タブのみを削除します。