递增列表变量然后循环它

时间:2018-03-20 13:41:20

标签: list loops sh ubuntu-16.04

在一个sh脚本中,我试图在文件夹中创建一个文件名列表,然后在其上循环以检查两个连续的文件名是否能很好地响应"表达式标准"。

在我的文件夹中: file1.nii file1_mask.nii file2.nii file2_mask.nii 等...... 未定义的文件数。但如果filex.nii存在,则必须有filex_mask.nii

在用户修改的.txt文件中。 它包含:

  

file1.nii tab一些参数\ n

     

file2.nii tab一些参数\ n

     等等......

脚本需要很长时间才能运行,例如,掩码文件仅在几个小时后使用。 所以我想在.sh的开头检查文件名是否拼写正确以及文件夹中是否存在.txt中的任何文件。 如果没有,请停止.sh并警告用户。在注意到问题之前不要等几个小时。

现在我试过了:

test=""
for entry in "${search_dir}"/*
do 
  echo  "$entry"
  test="${test} $entry"
done

我有一个字符串变量,文件名之间有空格,但它也有文件夹名称。 ./search_dir/file1.nii ./search_dir/file1_mask.nii 我想要file1.nii file1_mask.nii等...

现在我读了我的.txt文件并检查其中指定的文件名是否在我的测试变量中。

while read -r line
do
 set -- $line
 stack=$1
 check=False
 check2=False
 for i in $test; do
   echo "$stack.nii" 
   echo "$i"
   if "${stack}.nii" == "$i";
    then
      check=True
   fi
   if "${stack}_mask.nii"=="$i";
    then
      check2=True
   fi
done 

完成< " $ txt_file"

但它不起作用。

"$stack_mask.nii"=="$i"

似乎不是比较字符串的好方法 它会生成错误: " file1.nii"找不到

这是我现在的解决方案,基于glenn回答:

errs=0
while read -r line; do
  set -- $line
  prefix="${1}.nii"
  prefix2="${1}.nii.gz"
  if [ -e ${PATH}/$prefix2 ]; then       
   echo "File found: ${PATH}/$prefix2" >&2
  elif [ -e ${PATH}/$prefix ]; then
   echo "File found: ${PATH}/$prefix" >&2
  else
    echo "File not found: ${PATH}/$prefix" >&2
    errs=$((errs + 1))
  fi
  prefixmask="${1}_brain_mask.nii"
  prefixmask2="${1}_brain_maskefsd.nii.gz"
  if [ -e ${PATH}/$prefixmask ]; then
    echo "Mask file found for ${PATH}/$prefixmask" >&2
  elif [ -e ${PATH}/$prefixmask2 ]; then
    echo "Mask file found for ${PATH}/$prefixmask2" >&2    
  else
    echo "Mask file not found: ${PATH}/$prefixmask" >&2
    errs=$((errs + 1))
  fi
done < "$INPUT"
echo $errs
if [ $errs > 0 ]; then
  echo "Errors found"
  exit 3
fi

那么现在唯一的问题是它总是退出,即使错误等于0而且我也不知道为什么......

1 个答案:

答案 0 :(得分:1)

我会这样做:

errs=0
for f in "$search_dir"/*.mii; do
    [[ $f == *_mask.mii ]] && continue   # skip the mask files
    prefix=${f%.mii}                     # strip off the extension
    if [[ ! -f "${prefix}_mask.mii" ]]; then
        echo "Error: $f has no mask file" >&2
        ((errs++))
    fi
done
if [[ $errs -gt 0 ]]; then
    echo "Aborting due to errors" >&2
    exit 2
fi

这应该非常有效,因为它只是遍历文件一次。

现在我们看到了输入文件:

errs=0
while read -r mii_file other_stuff; do
    prefix="${mii_file%.mii}"
    if [[ ! -f ./"$mii_file" ]]; then       # adjust your relative path accordingly
        echo "File not found: $mii_file" >&2
        ((errs++))
    elif [[ ! -f ./"${prefix}_mask.mii" ]]; then
        echo "Mask file missing for $mii_file" >&2
        ((errs++))
    fi
done < "$txt_file"
if (( errs > 0 )); then
    echo "Errors found"
    exit 2
fi