我在 unix 中写入文件时遇到一些问题
[ -s $PWD/MEN/*sub.wav ] && echo "File there" || echo "File Not there" > temp.csv
我正在尝试这个 unix 命令,但它没有写入文件 temp.csv。
答案1
temp.csv
命令中写入的唯一内容是最后一个,只有在测试或第一个测试失败echo
时才会执行它。-s
echo
要正确输出到文件,请执行以下操作
if [ -s MEN/*sub.wav ]; then echo "File there"; else echo "File not there"; fi >temp.csv
或(不完全等同),
[ -s MEN/*sub.wav ] && echo "File there" >temp.csv || echo "File not there" >temp.csv
另请注意,如果您的模式MEN/*sub.wav
匹配多个文件名,则会在程序中生成语法错误。
您想测试一下是否最后一个name 与模式匹配,并且非空(-s
测试),然后使用
set -- MEN/*sub.wav
# Loop over the matching names (if any).
# Stop when we find a non-empty file.
while [ "$#" -gt 0 ] && [ ! -s "$1" ]; do
shift
done
if [ -s "$1" ]; then
echo File exists
else
echo File not there
fi >temp.csv
您想测试一下是否全部与模式匹配的名称非空:
set -- MEN/*sub.wav
# Loop over the matching names (if any).
# Stop when we find an empty file.
while [ "$#" -gt 0 ] && [ -s "$1" ]; do
shift
done
if [ "$#" -eq 0 ]; then
echo File(s) exists
else
echo File(s) not there
fi >temp.csv
最后一段代码依赖于 shell 保留未展开的模式,以防出现不匹配的名字。
答案2
如果你破坏了你的命令,那么这些是等效的
[ -s $PWD/MEN/*sub.wav ]
如果您的模式“$PWD”/MEN/*sub.wav 不匹配多个文件名,它无论如何都会执行。然后来了
echo "File There"
shell 尝试执行此命令,在您的情况下,它已成功执行,然后出现||
这意味着如果左侧部分失败,则执行右侧部分。当我们的左侧部分被执行时,右侧部分将永远不会被执行。如果你想写文件在那里到 temp.csv 那么你的命令看起来像
[ -s $PWD/MEN/*sub.wav ] && echo "File there" > temp.csv || echo "File Not there" > temp.csv
或者如果你想写这两部分
[ -s $PWD/MEN/*sub.wav ] && echo "File there" > temp.csv && echo "File Not there" > temp.csv