代码之家  ›  专栏  ›  技术社区  ›  Connor Johnson

将字符串参数传递给bash会导致语法错误

  •  0
  • Connor Johnson  · 技术社区  · 1 年前

    我正在尝试运行一个bash脚本,用于使用 AFNI's 3dcalc .

    该函数的参数之一是“expr”,它将“将表达式(引号内)应用于输入数据集(dnames),一次一个体素,以生成输出数据集”。在尝试启动此作业时,我遇到了如下语法错误:

    -bash: -c: line 0: syntax error near unexpected token `('
    -bash: -c: line 0: `apptainer run --cleanenv /Users/user44/fMRI/my_images/afni-binaries.sif 3dcalc -a /Users/user44/fMRI/PPMI/derivatives/afni_blur/sub-3102/sub-3102+tlrc.BRIK -b /Users/user44/fMRI/PPMI/derivatives/afni_scale/sub-3102/sub-3102_desc-scalestats+tlrc.BRIK -c /Users/user44/fMRI/PPMI/derivatives/fmriprep/sub-3102/func/sub-3102_task-rest_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz -expr c*min(200,a/b*100)*step(a)*step(b) -prefix /Users/user44/fMRI/PPMI/derivatives/afni_scale/sub-3102/sub-3102_task-rest_space-MNI152NLin2009cAsym_desc-preprocScaled_bold.nii '
    

    我的bash脚本附在这里:

    #!/bin/bash
    
    for fn in /Users/user44/fMRI/PPMI/derivatives/fmriprep/sub*/; do
        id=$(echo $fn | cut -d '/' -f 8)
        qsub -b y -q $QUEUE_NAME -pe orte 8 -l h_vmem=8G -N $id apptainer run --cleanenv ~/fMRI/my_images/afni-binaries.sif 3dcalc \
            -a ~/fMRI/PPMI/derivatives/afni_blur/${id}/${id}+tlrc.BRIK \
            -b ~/fMRI/PPMI/derivatives/afni_scale/${id}/${id}_desc-scalestats+tlrc.BRIK \
            -c ~/fMRI/PPMI/derivatives/fmriprep/${id}/func/${id}_task-rest_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz \
            -expr "c*min(200,a/b*100)*step(a)*step(b)" \
            -prefix ~/fMRI/PPMI/derivatives/afni_scale/${id}/${id}_task-rest_space-MNI152NLin2009cAsym_desc-preprocScaled_bold.nii
        break
    done
    

    我曾尝试用各种其他语法表示法替换引用的表达式,但我的bash经验有点欠缺,我还没能弄清楚问题是什么。尝试的解决方案包括:

    -expr "'c*min(200,a/b*100)*step(a)*step(b)'" \
    
    -expr "\'c*min(200,a/b*100)*step(a)*step(b)\'" \
    
    -expr "$('c*min(200,a/b*100)*step(a)*step(b)')" \
    

    我确信我违反了一个非常简单的语法规则,但如果您能帮助我识别所述违规行为,我将不胜感激!

    1 回复  |  直到 1 年前
        1
  •  0
  •   Barmar    1 年前

    您需要转义或引用 () 表达式中的字符。

            -expr "'c*min(200,a/b*100)*step(a)*step(b)'" \
    
    推荐文章