当我在终端上运行 shell 脚本时,由于某种原因它无法工作。假设我的文件名是 Final_exam.sh,下面是我的命令。
chmod 755 final_exam.sh
sh final_exam.sh
它说
ls: cannot access 'PATH_TO_FILES/A.csv': No such file or directory
ls: cannot access 'PATH_TO_FILES/B.csv': No such file or directory
我应该怎么办?任何建议/建议将不胜感激。
我一直在尝试运行 shell 脚本,但它不起作用,说“没有这样的文件或目录”。我附上了我的结果的屏幕截图,非常感谢您的任何建议/帮助。万分感谢。
stats@stats-VirtualBox:~/Desktop$ ls
FINAL_Project __MACOSX
stats@stats-VirtualBox:~/Desktop$ cd FINAL_Project
stats@stats-VirtualBox:~/Desktop/FINAL_Project$ cd final_exam
stats@stats-VirtualBox:~/Desktop/FINAL_Project/final_exam$ pwd
/home/stats/Desktop/FINAL_Project/final_exam
stats@stats-VirtualBox:~/Desktop/FINAL_Project/final_exam$ ls
Domains_FormB.csv final_project.sh Numeric1.awk WidetoLong.r
Domains_FormV.csv FirstConvert.r Numeric2.awk
Final_Output FormV.csv SecondConvert.r
stats@stats-VirtualBox:~/Desktop/FINAL_Project/final_exam$
所以,基本上,^^ 具有 csv 的完整堆路径。文件。
这是我的 shell 脚本。
# 9 Path to the folder with the data
#PATH_TO_FILES=../.
PATH_TO_FILES=home/Desktop/FINAL_Project/final_exam
sed -i 's/^M//g' FirstConvert.r
sed -i 's/^M//g' SecondConvert.r
sed -i 's/^M//g' WidetoLong.r
# 1 Remove any files that had been created in previous attempts
rm -f Final_Output
touch Final_Output
for file in `ls PATH_TO_FILES/Form?.csv`
do
fname=`echo $file | sed 's/.*\///g' | sed 's/\.csv//g'`
# 2 Separate the answer key from the student answers
grep "KEY" $file > OUT_Answers_$fname
grep -v "KEY" $file > OUT_StudentAnswers_$fname
# 3 Use the R script provided that matches the student answers to the answer key
Rscript FirstConvert.r OUT_StudentAnswers_$fname OUT_Answers_$fname OUT_FirstConvert_$fname
# 4 Use the R script provided which changes the R object from wide to long format
Rscript WidetoLong.r OUT_FirstConvert_$fname OUT_WidetoLong_$fname
sed -i 's/\"//g' OUT_WidetoLong_$fname
# 5 Format the resulting question numbers from the file in step 4
awk -f Numeric1.awk OUT_WidetoLong_$fname > OUT_Questions_$fname
done
for file in `ls PATH_TO_FILES/Domains_Form?.csv`
do
fname=`echo $file | sed 's/.*\///g' | sed 's/Domains_//g' | sed 's/\.csv//g'`
# 6 Select only the domain number and question number from the domains file and remove the header
tail -n +2 $file | cut -d',' -f3,4 | sed 's/,/ /g' | sed 's/\r//g' > OUT_Domain_tmp_$fname
# 7 Modify the script from step 5 to format the question numbers in the file you created in step 6 to be sorted correctly
awk -f Numeric2.awk OUT_Domain_tmp_$fname > OUT_Domain_$fname
# 8 Join your student's answer file to the domains on/by question number
join -1 3 -2 2 -o 1.1,1.2,1.3,2.1,1.4 OUT_Questions_$fname OUT_Domain_$fname >> Final_Output
done
# Clean intermediate files
rm -f OUT_*
答案1
阅读所有评论后没有找到它,假设您的 for 循环包括$
我想说PATH_TO_FILES=home/Desktop/FINAL_Project/final_exam
缺少一个领先的/
.
您的脚本可能正在搜索<current dir>home
您可以通过在脚本开头“回显”变量来找到答案:
...
echo $PATH_TO_FILES
...
另外,由于它在问题的标题中,因此当您使用或像这样运行脚本时,您不需要chmod
脚本sh
bash
bash my_script.sh
事实上,您可以完全省略 shebang。
希望有帮助
答案2
该错误消息不是关于final_project.sh
.它确实打开并运行,并且我认为脚本正在调用错误消息ls
:它抱怨两个参数与它可以找到的任何文件不对应。
请粘贴脚本的内容而不是屏幕截图(使用{}工具栏中的按钮将其格式化为代码),以及这些 .csv 文件的完整路径。我们也许能够找出它在哪里寻找这些文件。
答案3
正如所指出的阿里尔公司,执行时脚本内容抛出错误,您可以修改上面的脚本for
循环来解决问题。
for file in `ls PATH_TO_FILES/Form?.csv
转换成
for file in `ls $PATH_TO_FILES/Form?.csv`
变量前添加$
将会替换变量的值。