使用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
答案 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]
为abc
,arr[1]
为空,arr[2]
为def
,而不是arr[0]
{1}} abc
是arr[1]
,def
是my $c = ($sa =~ /$sb/) || (-1) *($sb =~ /$sa/);
。
取自IFS wiki和Greycat Lhunath的Bash 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"