使用 UNIX/Linux,一个简单的解决方案是:
for i in $(< mylist.txt ); do
if [ ! -r $i ] ; then
echo "file missing! $i"
exit 1
fi
done
Run Code Online (Sandbox Code Playgroud)
但是,如果每行仅指定一个文件,但文件名可能包含空格,则会中断。文件名中的空格在用户中很受欢迎,但在程序员中却不受欢迎,这是有原因的。我尝试添加引号,但这不起作用:在 for 命令中,空格被用作分隔符。
我怎样才能以简单的方式解决这个问题?
循环for总是根据空格分割输入。
我们可以更改输入分隔符IFS以仅使用换行符作为分隔符:
#!/bin/sh
(
IFS='
'
for i in $(cat mylist.txt)
do
if [ ! -r "$i" ]
then
echo "file missing! $i" >&2
exit 1
fi
done
)
Run Code Online (Sandbox Code Playgroud)
一个更简单、更好的read替代方法是在循环中使用while:
#!/bin/sh
while IFS= read -r i
do
if [ ! -r "$i" ]
then
echo "file missing! $i" >&2
exit 1
fi
done <mylist.txt
Run Code Online (Sandbox Code Playgroud)
$i还要注意,我们需要在命令中引用扩展[,并且错误消息应该转到错误流。
此外,这仅使用可移植的结构;无需将其限制为仅限 Bash。