【问题标题】:bash Shell: lost first element data partiallybash Shell:部分丢失第一个元素数据
【发布时间】:2016-06-24 21:31:08
【问题描述】:

使用 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"

第一次成功执行,但当循环第二次执行时。 变量filebbbbb.mp4丢失bbbbb 并输出以下输出

输出:

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

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

lineempty

【问题讨论】:

  • 虽然您的代码看起来过于复杂,但当我使用此数据运行代码时,我没有得到此输出,但文件名报告正确。您是否尝试过使用 bash -x 运行它?顺便说一句,您已经标记了bash,但是当您运行它时,您使用的是sh,而不是bash。请注意,您可能会得到不同的结果。

标签: bash shell ffmpeg centos


【解决方案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"

【讨论】:

    【解决方案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]empty 并且 arr[2]def,而不是 arr[0]abcarr[1]正如人们所期望的那样,是def

    取自IFS wikiGreycatLhunathBash Guide

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

    【讨论】:

    • 感谢@Rany,我刚刚放置了 'output=$(ffmpeg -v warning -ss 2 -t 0.8 -i $file -vf scale=200:-1 -gifflags +transdiff -y $hash
    • 其实问题出在 ffmpeg 执行由于一些 I/O 问题
    • 酷 :-) 很高兴听到它对你有用。常见问题解答有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多