我有一个如下所示的文件(file1.txt)
258.2222
我必须将此file1.txt
值写入另一个文件。如果没有值(空),那么file1.txt
它应该打印为“通过”。
这就是我尝试过的
for final in $(cat file1.txt);do
if [ "$final" ];then
echo $final > file2.txt
else
echo "Passed" > file2.txt
fi
done
这仅适用于 1 个场景。如果没有值file1.txt
那么它就不会写成“通过”
预期输出:
如果 中有一个值file1.txt
:
258.2222
如果 中没有值(空)file1.txt
:
Passed
有人可以帮我解决这个问题吗?提前致谢!
注意:我不允许使用通用脚本语言(JavaScript、Python 等)。
答案1
它不起作用的原因是for
循环。当文件中没有值时,循环就没有任何内容for
可以迭代,因此它甚至不会启动,因此if
永远不会评估。然而,由于文件中只能有一行,因此循环是没有意义的。只需做这样的事情:
final=$(cat file1.txt)
if [ -n "$final" ]; then
printf '%s\n' "$final"
else
printf 'Passed\n'
fi
然后,运行脚本并将其输出重定向到文件(对输出文件名进行硬编码通常是不好的做法,因为这可能会导致无意中覆盖任何具有相同名称的现有文件,并且还会限制脚本的使用方式):
script.sh > file2.txt
请注意,如果文件除了空格之外什么都没有,这也会打印,因为那是“有东西”而不是“没有”。
答案2
如果file1.txt
包含某些内容(其文件大小非零),您希望该内容进入file2.txt
:
if [ -s file1.txt ]; then
cp file1.txt file2.txt
fi
如果file1.txt
是空的(或缺失),那么你想要一行Passed
写成file2.txt
:
if [ -s file1.txt ]; then
cp file1.txt file2.txt
else
echo Passed >file2.txt
fi
如果您想避免创建file2.txt
iffile1.txt
缺失:
if [ -s file1.txt ]; then
cp file1.txt file2.txt
elif [ -e file1.txt ]; then
echo Passed >file2.txt
fi
现在仅当测试失败(文件不存在或为空)并且测试成功(文件存在)echo
时才执行。-s
-e
在任何时候,您实际上都不必循环读取文件中的数据。