bash 脚本虽然需要但不保存输出文件

时间:2021-04-12 10:38:06

标签: bash shell sh

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

valuesfile="values.*"

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

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

3 个答案:

答案 0 :(得分:0)

只需阅读这段代码:

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

我不认为任何文件都可以被称为 values.*,我期待像 values.1values.txt 这样的东西,但是包含星号的文件名对我来说看起来很奇怪。< /p>

评论后编辑

我提出以下建议:

valuesfile="values.*"

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您的 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