编写以下简单的 .sh 脚本,将 output.txt 保存到工作目录:
valuesfile="values.*"
for f in ./
do
if [[ $f = $valuesfile ]]
then
yq d $f 'resources.' >./output.txt
fi
done
当我执行脚本时,没有创建文件。所有文件夹都具有 rwx 权限,包括脚本本身。
答案 0 :(得分:0)
只需阅读这段代码:
valuesfile="values.*"
...
if [[ $f = $valuesfile ]]
我不认为任何文件都可以被称为 values.*
,我期待像 values.1
或 values.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