ubuntu 尝试在bash中创建一个变量:“无此变量”

7qhs6swi  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(104)

对于一些背景,我正在使用Ubuntu 18.04上的Linux Windows子系统。我对bash脚本很陌生,所以可能会有一些看起来很明显的错误,但我还没有设法在网上找到答案。
我尝试将subj设置为'S',后跟id号。我还尝试用subj替换design.fsf文件中的所有S201示例,这样它会在重复脚本时使用所有ID运行它。

#!/bin/bash                                                                                                                                                                                                             

for id in $(seq 204 204) ; do
subj="S$id"
echo "===> Starting processing of $subj"                                
echo                                                                    
cd "$subj" || exit 

sed -i "s/S201/${subj}/g" design.fsf

echo "===> Starting feat for run 1"

feat design.fsf                                                                                                                                                                                                                                                                                          

echo 

done

字符串
(请注意,通常seq中的序列是204-209,但为了避免它一遍又一遍地运行相同的问题,我只是在204中替换,所以它不会尝试在每个数字上运行它)

**我的问题:**运行时返回:

===> Starting processing of S204
===> Starting feat for run 1
can't read "subj": no such variable while executing
"set fmri(outputdir) "/usr/local/fsl/data/subjects2/{$subj}""
(file "/usr/local/fsl/data/subjects2/S204/design.fsf" line 33)
invoked from within

"source ${filename}"
(procedure "feat5:load" line 27)
invoked from within

"feat5:load -1 1 ${fsfroot}.fsf"
(file "/usr/local/fsl/bin/feat" line 309)


如果你能解释一下你的更正,这样我就明白将来会用到它,那将是额外的帮助,我会非常感激。TIA。
注意:我已经通过ShellCheck运行了这个,它说它很好。

ttp71kqs

ttp71kqs1#

问题出在feat是什么-它是报告错误的东西,它告诉你错误是它在file "/usr/local/fsl/data/subjects2/S204/design.fsf" line 33can't read "subj",而试图执行命令set fmri(outputdir) "/usr/local/fsl/data/subjects2/{$subj}"
我怀疑纠正你的shellcheck问题实际上解决了你的问题,但是当你以前运行你的工具时,sed -i 's/S201/${subj}/g' design.fsf(带单引号)用文字字符串${subj}替换了S201,所以现在当你运行sed -i "s/S201/${subj}/g" design.fsf(带双引号)时,design.fsf中没有S201,所以替换不会发生,然后feat仍然试图处理包含$subj的输入。您需要将design.fsf还原到包含S201的位置,然后再次运行您的工具。
为了解决这个问题,以便您可以迭代通过多个$subj值,将sed -i "s/S201/${subj}/g" design.fsf; feat design.fsf更改为sed "s/S201/${subj}/g" design.fsf > tmp.fsf && feat tmp.fsf或类似值,这样您就不会覆盖包含S201的原始文件,这样在每次迭代中仍然可以替换。
我会修改你的脚本为:

#!/usr/bin/env bash                                                                                                                                                                                                             

tmp=$(mktemp) || { ret="$?"; echo "Failed to create tmp file" >&2; exit "$ret"; }
trap 'rm -f "$tmp"; exit' 0

for id in {204..204}; do
    subj="S$id"
    echo "===> Starting processing of $subj"                                
    echo                                                                    
    cd "$subj" || { ret="$?"; echo "Failed to cd to \"$subj\"" >&2; exit "$ret"; }

    sed "s/S201/$subj/g" design.fsf > "$tmp" || { ret="$?"; echo "Failed to sed design.fsf" >&2; exit "$ret"; }

    echo "===> Starting feat for run 1"

    feat "$tmp"  || { ret=$?; echo "Failed running feat \"$tmp\"" >&2; exit "$ret"; }
    echo 

done

字符串
请注意,sed "s/S201/$subj/g"是脆弱的,因为它会修改包含S201作为子字符串的文本,例如。LOSS201BAD,因此您可能需要使用单词边界和/或其他分隔符来收紧regexp。

syqv5f0l

syqv5f0l2#

你必须有一个损坏的文件“/usr/local/fsl/data/subjects 2/S204/design.fsf”行33从以前失败的尝试;您必须重建损坏的线路。

相关问题