bash脚本和条件语句

时间:2013-07-19 11:04:21

标签: bash

我正在尝试运行一个简单的bash脚本,但我正在努力解决如何操作条件。任何指针。循环说。我想加入一个条件,当gdalinfo无法打开图像时,它会将该特定文件复制到另一个位置。

for file in `cat path.txt`; do gdalinfo $file;done

可以正常打开图像,还可以显示哪些图像无法打开 错误的代码是

for file in `cat path.txt`; do gdalinfo $file && echo $file; else cp $file /data/temp

2 个答案:

答案 0 :(得分:6)

再次,一次又一次 - 再次zilion ......

请勿使用

之类的结论
for file in `cat path.txt`

for file in `find .....`
for file in `any command what produces filenames`

因为当文件名或路径包含空格时,代码将立即BREAK。永远不要将它用于任何产生文件名的命令。不好的做法。很坏。这是错误的,错误的,错误的,不准确的,不准确的,不精确的,错误的,错误的。

正确的形式是:

for file in some/*   #if want/can use filenames directly from the filesystem

find . -print0 | while IFS= read -r -d '' file

或(如果您确定没有文件名包含换行符)可以使用

cat path.txt | while read -r file

但是这里cat没用,(实际上 - 命令将文件复制到STDOUT 无用)。你应该使用

while read -r file
do
   #whatever
done < path.txt

它更快(不会分叉新进程,就像每个管道一样)。

如果文件名也包含空格,上面的while会将corect文件名填充到变量file中。 for 不会。期。 UFF。 OMG。

出于同样的原因,请使用"$variable_with_filename"代替纯$variable_with_filename。如果文件名包含空格,则任何命令都会将其误解为两个文件名。这可能不是,你想要的......

因此,请包含任何包含带双引号的文件名的shell变量。 (不仅是文件名,还包含任何可以包含空格的东西)。 "$variable"是正确的。

如果我理解正确,当/data/temp返回错误时,您希望将文件复制到gdalinfo

while read -r file
do
   gdalinfo "$file" || cp "$file" /data/temp
done < path.txt

美观,简短且安全(至少如果你的path.txt每行真的包含一个文件名)。

也许,你想要多次使用你的脚本,因此不要在里面输出文件名,而是将脚本保存在表格中

while read -r file
do
   gdalinfo "$file" || cp "$file" /data/temp
done

并使用它:

mygdalinfo < path.txt

更普遍...

也许,您只想显示gdalinfo返回错误

的文件名
while read -r file
do
   gdalinfo "$file" || printf "$file\n"
done

如果您将printf "$file\n"更改为printf "$file\0",则可以安全地在管道中使用该脚本,因此:

while read -r file
do
   gdalinfo "$file" || printf "$file\0"
done

并将其用作例如:

 mygdalinfo < path.txt | xargs -0 -J% mv % /tmp/somewhere

Howgh。

答案 1 :(得分:1)

你可以说:

for file in `cat path.txt`; do gdalinfo $file || cp $file /data/temp; done

如果gdalinfo无法打开图像,则会将文件复制到/data/temp

如果您想要在出现故障时复制文件名,请说:

for file in `cat path.txt`; do gdalinfo $file || (echo $file && cp $file /data/temp); done