如何使用 shell 脚本读取一个文件并写入另一个文件

如何使用 shell 脚本读取一个文件并写入另一个文件

我有一个如下所示的文件(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.txtiffile1.txt缺失:

if [ -s file1.txt ]; then
    cp file1.txt file2.txt
elif [ -e file1.txt ]; then
    echo Passed >file2.txt
fi

现在仅当测试失败(文件不存在或为空)并且测试成功(文件存在)echo时才执行。-s-e

在任何时候,您实际上都不必循环读取文件中的数据。

相关内容