【问题标题】:bash script do not save output file although required尽管需要,但 bash 脚本不保存输出文件
【发布时间】:2021-04-12 10:38:06
【问题描述】:

编写了以下简单的 .sh 脚本,该脚本应将 output.txt 保存到工作目录:

valuesfile="values.*"

for f in ./
do
 if [[ $f = $valuesfile ]]
 then
     yq d $f 'resources.' >./output.txt
 fi
done

当我执行脚本时,没有创建文件。所有文件夹都具有 rwx 权限,包括脚本本身。

【问题讨论】:

  • 检查脚本输出的内容而不重定向到文件。我不熟悉yq,但d 看起来很奇怪。通常人们会期望一个选项至少有 1 个-
  • 看起来if 的主体永远不会执行。
  • 是的。这也很奇怪!
  • 您应该重新了解 shell 文件名扩展的工作原理。
  • 从好的方面来说,至少你没有犯常见的初学者错误,即尝试在这里使用ls

标签: bash shell sh


【解决方案1】:

您的条件永远不会为真,因此,yq 永远不会被执行。

循环体只执行一次,f 设置为字符串./valuesfile 设置为字符串values.*。这些字符串显然不相等。

【讨论】:

  • 按值。*我的意思是正则表达式。在工作目录中,我想获取所有以“值”开头的文件,并对每个文件执行 yq 命令。
  • 您没有在脚本中进行正则表达式匹配。这将由=~ 操作员完成,而不是由=。要查找名称以 values 开头的文件,正则表达式是多余的。通配符模式匹配就足够了。您可以通过[[ $filename == values* ]] 将很多文件名存储在变量filename 中。当然,即使这样也不能解决您的问题,因为您的变量 f.... 中存储了无意义的值
  • 请在我的新帖子上闲逛:stackoverflow.com/questions/67089998/…
【解决方案2】:

只需阅读这段代码:

valuesfile="values.*"
...
 if [[ $f = $valuesfile ]]

我不认为任何文件都可以称为values.*,我期待类似values.1values.txt,但包含星号的文件名对我来说看起来很奇怪。

评论后编辑

我提出以下建议:

valuesfile="values.*"

for f in ./$valuesfile
do
     yq d $f 'resources.' >./output.txt
done

【讨论】:

  • 按值。*我的意思是正则表达式。在工作目录中,我想获取所有以“值”开头的文件,并对每个文件执行 yq 命令。
  • 你为什么还要使用正则表达式?我相信像for f in ./$valuefile 这样的东西应该可以解决问题,不是吗?不需要if-clause。
  • 我已经更新了我的答案(但是没有经过测试),你明白我的意思吗?
  • 我明白,但是 valuesfile 不是一个 repo,所以你怎么能“for f in ./$valuesfile”呢?对不起,如果我缺乏知识..
  • 我想查看目录中的所有文件:/usr/src/mydir/。在 /mydir 中有一些文件的名称以“值”开头......所以我只想查看这些文件并执行 yq 命令。
【解决方案3】:

您的 glob 永远不会扩展:[[ ... ]] 中未加引号的参数扩展不会进行路径名扩展。您的循环也不正确:for f in ./ 只迭代一次,将f 设置为字符串./,而不是直接迭代当前文件中的文件。最后,如果有个匹配文件,你会重复覆盖output.txt之前的内容;请改用>>

可以试试

valuesfile="values.*"

for f in ./$valuesfile
do
     yq d "$f" 'resources.' >> ./output.txt
done

虽然如果您的任何文件有空格,这会导致问题,因为 $valuesfile 的扩展会经历分词以及路径名扩展。

改用数组:

valuesfile=( values.* )

for f in "${valuesfile[@]}"
do
  yq d "$f" 'resources.' >> output.txt
done

或者,省去额外的变量,直接将模式放入循环中:

for f in values.*
do
  yq d "$f" 'resources.' >> output.txt
done

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
相关资源
最近更新 更多