【发布时间】:2022-01-18 19:19:08
【问题描述】:
bash 超级新手
我编写了一个 bash 脚本,它可以在一个 MAC 上完美运行,但不能在不同的 MAC 上运行。
代码在主题文件夹中迭代循环,复制数据,执行某些功能,删除复制的数据,然后移动到下一个主题。为此,我调用了一个包含主题名称的文本文件,它通知脚本选择相应的主题文件夹(在下面的代码中使用变量 $mri_path)。
问题是,在这个新的 MAC 上 - 脚本无法使用文本文件找到主题的文件夹 - 错误代码:文件/目录不存在。 MAC 之间的主要区别在于所使用的文本文件——它包含不同的主题名称。我可以对脚本进行硬编码以查找主题的文件夹,所以这让我怀疑文本文件没有被正确读取。
我尝试了不同的文本文件格式(例如,unicode、Macintosh 格式、制表符分隔)...所以我不知道为什么脚本找不到主题文件夹。
精简代码:
#!/bin/bash
#usage: ./dcm2nii_batch.sh subj.txt startline endline
s1=$(($2-1))
s2=$(($3-1))
vars=($(awk -F= '{print$1}' subj.txt));
for ((i=s1; i<s2; i++));
do mri_path=${vars[$i])};
echo $mri_path;
echo '***';
cd /Users/syschaef/Desktop/dcm2nii_batch/Raw/$mri_path
由于cd 命令失败,错误出现在最后一行。
文本文件数据是与主题文件夹名称/目录相对应的主题标识号(屏幕截图):
感谢您抽出宝贵时间阅读和/或回复!
【问题讨论】:
-
旁注:整个最后一个循环可以替换为
rm */*.dcm -
你能减少脚本只保留导致错误的部分吗?我不明白错误到底发生在哪里,或者“使用文本文件查找主题文件夹”是什么意思。
-
@BenjaminW。感谢您的回复! 1)我减少了代码-它现在以失败的“更改目录”命令结束。 2)“使用文本文件查找主题文件夹”是指脚本调用包含主题名称的文本文件,通知脚本选择与主题对应的特定文件夹。例如,脚本将调用文本文件的第一行“主题 1”,然后打开名为“主题 1”的文件夹;循环的下一次迭代将调用文本文件“subject 2”的下一行,然后打开名为“subject 2”的文件夹
-
文本文件的内容是什么?路径中有空格吗?尝试添加足够的信息,以便任何人都可以通过问题中的内容重现问题 (minimal reproducible example)。
-
我怀疑您的文本文件中可能存在 Windows 行尾(带有回车符,
\r\n而不仅仅是\n)。在运行脚本之前,在文件上尝试dos2unix。此外,要逐行读取文件,请查看 BashFAQ/001 和 Looping through the content of a file in Bash
标签: bash variables text-files