bash Shell:部分丢失了第一个元素数据

时间:2016-03-10 07:01:55

标签: bash shell ffmpeg centos

使用bash shell: 我试图逐行读取文件。 每行包含两个由"``"

分隔的完整文件名

档案:1 image_config.txt

bbbbb.mp4``thumb/hashdata.gif
bbbbb.mp4``thumb/hashdata2.gif

Shell脚本

#!/bin/bash
filename="image_config.txt"

while IFS='' read -r line || [[ -n "$line" ]]; do

IFS='``' read -r -a array <<< "$line"
if [ "$line" = "" ]; then
echo lineempty
else

file=${array[0]}
hash=${array[2]}

    echo $file$hash;
    output=$(ffmpeg -v warning -ss 2 -t 0.8 -i $file -vf scale=200:-1 -gifflags +transdiff -y $hash);
    echo $output;
#    echo ${array[0]}${array[1]}${array[2]}
fi;

done < "$filename"

第一次成功执行,但循环执行第二次。 来自file的变量bbbbb丢失bbbbb.mp4 以下输出结果

输出

user@domain [~/public_html/Videos]$ sh imager.sh 
bbbbb.mp4thumb/hashdata.gif

.mp4thumb/hashdata2.gif
.mp4: No such file or directory

lineempty

2 个答案:

答案 0 :(得分:2)

请查看Bash FAQ 89 - I'm using a loop which runs once per line of input but it only seems to run once; everything after the first line is ignored?,这似乎对您的情况有所帮助。

<强>除了:

IFS中使用相同的字符两次没有意义。

IFS=\`

够了。

看看这个:

var='abc``def'
IFS=\`\` read -ra arr <<< "$var"
printf '<%s>\n' "${arr[@]}"

输出:

<abc>
<>
<def>

如您所见,arr[0]abcarr[1] 为空arr[2]def,而不是arr[0] {1}} abcarr[1]defmy $c = ($sa =~ /$sb/) || (-1) *($sb =~ /$sa/);

取自IFS wikiGreycat LhunathBash Guide

  

IFS变量在shell(Bourne,POSIX,ksh,bash)中用作输入字段分隔符(或内部字段分隔符)。 基本上,它是一串特殊字符,在分割输入行时将被视为单词/字段之间的分隔符。

答案 1 :(得分:1)

以下是您可以采取的不同方式,避免在阅读中阅读:

#!/bin/bash
filename="image_config.txt"

while IFS='' read -r line || [[ -n "$line" ]]; do
  if [ "$line" = "" ]; then
    echo lineempty
  else

  file=$( echo ${line} | awk -F \` ' { print $1 } ' )
  hash=$( echo ${line} | awk -F \` ' { print $3 } ' )

      echo $file$hash;
      output=$(ffmpeg -v warning -ss 2 -t 0.8 -i $file -vf scale=200:-1 -gifflags +transdiff -y $hash);
      echo $output;
  fi;

done < "$filename"