命令在 shell 中运行,但不在脚本中运行:找不到目录错误

命令在 shell 中运行,但不在脚本中运行:找不到目录错误

我有一些命令不作为脚本运行。

它应该创建文件名的项目符号列表,然后按字母顺序对每个文件的列进行排序,抓取第二列及其匹配的第三列,并将它们放入 HTML 标记中。它在大多数情况下运行良好,但无法成功删除 .csv 文件扩展名。

每次我运行脚本时,它都会重复line 10 p: No such file or directory found返回line 21: /a No such file or directory found

sort更新:我的电脑上似乎出现了错误。我运行了一个简单的 shell 脚本,仅包含排序注释,但出现错误no such file or directory。我已经在我的sudoers名单上了,但也许我做错了什么。我不明白为什么有些人评论说运行脚本没有问题。

#!/bin/bash

for file in *.csv; do
name=${file%.csv}
 echo "<li><a href='$file'>$file</a></li>" >> final.html
done
for file in *.csv; do
 name=${file%.csv}
 sort -t"," -k2 "$file" |
 awk -vfile="$name" -F"," '
 BEGIN {
 printf "<h3 id=\"%s\">%s</h3>\n", file, file
 printf "<ul class=\"no-bullet\">\n"
 }
 {
 printf "<li>%s (%s)</li>\n", $2, $3
 }
 END {
 printf "</ul>\n"
 printf "<p id=\"%s\" class=\"text-smaller block-looser\">[<a href=\"#top\">Return to Top</a>]</p>\n", file
 }
 ' >> final.html
done

当我运行时,bash -x myscript.sh我注意到它最终开始返回:

 BEGIN {
 printf "<h3 id=\"%s\">%s</h3>\n", file, file
 printf "<ul class=\"no-bullet\">\n"
 }
 {
+ sort -t, -k2 file.csv
 printf "<li>%s (%s)</li>\n", $2, $3
 }
 END {
 printf "</ul>\n"
 printf ' 'id="%s"' 'class="text-smaller' 'block-looser"'
myscript.sh: line 9: p: No such file or directory
+ href='"#top"'
+ to Top
myscript.sh: line 21: /a: No such file or directory

我不明白在 shell 中运行它与在脚本中运行它之间有什么差异,特别是当我在与 .csv 文件相同的目录中运行它时。将命令粘贴到命令行中时,不会出现这些问题。

更新:使用目录运行代码只会使第一个 for 循环运行,但在第二个循环中仍然存在问题。

我不小心写下了第 10 行和第 22 行,而不是第 10 行和第 21 行,并更新了帖子以反映这一点。尝试调试/解析正在发生的事情时,可能在某处有额外的一行。

以下是我尝试使用此 shell 脚本运行的示例 .csv 文件。

通讯录.csv

ID,Name,State
1,John,NY
2,Rachel,SC

此代码的预期输出:


<li><a href='Contacts'> Contacts</a></li>

<h3 id='Contacts'> Contacts </h3>

<ul class="no-bullet">

<li>John (NY) </li>
<li>Rachel (SC) </li>
</ul>

<p id='Contacts' class="text-smaller">[<a href="#top">Return to top</a>]</p>

我也尝试过使用printf "<p,但printf '<p没有效果。

第二次更新:即使从这篇文章粘贴,脚本仍然无法按预期运行。我更新了自制程序并尝试了不同的机器,但没有运气。可能是怎么回事???

答案1

您只有文件名。这意味着脚本正在“当前目录”(您进入的目录)中查找文件cd。它与您要使用的文件在同一目录吗?

使用绝对文件名:/somedir/someotherdir/filename- 这样您将始终在已知位置查找文件。

答案2

只有两种方法可以导致您的问题中给出的问题描述。

  1. 您编辑了脚本当它正在执行时。解决方案:不要这样做
  2. 文件系统损坏意味着您的脚本文件受到其他编写者的影响。解决方案:强制进行文件系统检查

相关内容