所以我希望我的脚本能够测试我已经填充了数字的文件是否存在。它确实做到了这一点,但在完成之后,我希望它运行一段时间,检查文件中的数字是奇数还是偶数,因为它检查每行上的每个数字。据我所知,我的脚本结构很糟糕,但我下面的代码没有产生期望的结果。
exist=rnddata.txt
if [ -f $exist ]; then
echo "file exist processing"
else
echo "file does not exist"
exit1
fi
while read exist
do
if [ $((exist % 2)) -eq 0 ]; then
echo "even"
else
echo "odd"
fi
done
exit
答案1
尝试这个:
while read number
do
if [ $((number % 2)) -eq 0 ]; then
echo even
else
echo odd
fi
done < "$exist"
read
读取命令行上的变量。因此,您必须将文件数据输入循环中才能read
获取它。这里我们用循环的< "$exist"
after来做到这一点。done
while
该read
命令没有联机帮助页,因为它是 shell 内置命令。要查看它是如何工作的,请输入man sh
(提示,搜索,readonly
因为这样更容易找到。)
答案2
大多数情况下,您不必担心以下问题:
if [ -e "$file" ]
then echo exists
else echo not exists
fi
当人们做这种事情时,他们实际上只是在白费力气。它还可能存在问题,因为一个脚本与另一个脚本的行为和输出格式之间几乎没有联系。无论如何,这一切都是白费力气,因为:
sh -c 'exec <not_exist; echo can i\?' my_zero
my_zero: 1: my_zero: cannot open not_exist: No such file
当特殊的 shell 内置函数是任何失败的 shell 重定向的对象时,脚本化 POSIX shell 会因写入 stderr 而死亡。特殊的内置函数是:
: continue break exec set . shift unset
times trap exit export readonly eval return
他们的特殊地位可以通过以下方式致电他们来降级command
:
sh -c 'command exec <not_exist; echo can i\?' my_zero
my_zero: 1: my_zero: cannot open not_exist: No such file
can i?
因此,稳健地处理读/写文件的最直接、最有效的策略是将文件直接放在要与之交互的文件描述符上,并让 shell 根据需要处理任何/所有错误输出。如果应该的话,并且如果您在编写脚本时着眼于让行动自己说话,那么它就会发生。
sh -c '
cat_fname()
for f
do exec <"$f"
printf "\n%-5s%-$((${#f}+2))s%s\n" === "$f" ===
cat
done
cat_fname a[1-9]/a[1-9].txt not_exist /dev/fd/0'
=== a1/a1.txt ===
1 1 1 11 1 1 1 1
=== a2/a2.txt ===
2 2 2 12 2 2 2 2
=== a3/a3.txt ===
3 3 3 13 3 3 3 3
=== a4/a4.txt ===
4 4 4 14 4 4 4 4
=== a5/a5.txt ===
5 5 5 15 5 5 5 5
=== a6/a6.txt ===
6 6 6 16 6 6 6 6
=== a7/a7.txt ===
7 7 7 17 7 7 7 7
=== a8/a8.txt ===
8 8 8 18 8 8 8 8
=== a9/a9.txt ===
9 9 9 19 9 9 9 9
sh: 4: cannot open not_exist: No such file