Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 循环中的函数每隔一次迭代就会损坏一次_Linux_Bash - Fatal编程技术网

Linux 循环中的函数每隔一次迭代就会损坏一次

Linux 循环中的函数每隔一次迭代就会损坏一次,linux,bash,Linux,Bash,我制作了一个简短的bash程序来下载播客,只检索最后20秒。 奇怪的是,它每隔一次迭代就无法下载一次。函数trim_nsec似乎有问题,因为当我在循环中去掉它时,其余的都能正常工作 编辑:添加双引号,这并不能解决问题 <!-- language: lang-bash --> #!/bin/bash # Get podcast list wget -O feed http://www.rtl.fr/podcast/on-n-est-pas-forcement-d-accord.xml

我制作了一个简短的bash程序来下载播客,只检索最后20秒。 奇怪的是,它每隔一次迭代就无法下载一次。函数trim_nsec似乎有问题,因为当我在循环中去掉它时,其余的都能正常工作

编辑:添加双引号,这并不能解决问题

<!-- language: lang-bash -->
#!/bin/bash

# Get podcast list
wget -O feed http://www.rtl.fr/podcast/on-n-est-pas-forcement-d-accord.xml

function trim_nsec () {
    # arguments : 1 : mp3file - 2 : duration - 3 : outputfile
    duration=$(ffprobe -i "${1}" -show_entries format=duration -v quiet -of csv="p=0")
    nth_second=$(echo "${duration} - ${2}"|bc)
    ffmpeg -i "${1}" -ss "${nth_second}" "${3}"
}

cpt=1

# let's work only on the 4th first files
grep -Po 'http[^<]*.mp3' feed|grep admedia| head -n 4 > list

cat list | while read i
do
    year=$(echo "$i" | cut -d"/" -f6)
    day=$(echo "$i" | cut -d"/" -f7)
    fullname=$(echo "$i" | awk -F"/" '{print $NF}')
    fullnameend=$(echo "$fullname" |sed -e 's/\.mp3$/_end\.mp3/')
    new_name=$(echo "$year"_"$day"_"$fullnameend")

    # let's download
    wget -O "$fullname" "$i"
    # let's trim last 20 sec
    trim_nsec "$fullname" 20 "$new_name"
    echo "$cpt file processed"
    #delete orig. file :
    rm "$fullname"
    ((cpt++)) 
done

有什么想法吗

问题最有可能是由于在出现错误时,ffmpeg将尝试从用户处获取输入,用户将使用cat list提供的输入。看到类似的问题或答案。为了防止trim_nsec使用cat列表中的输入,您可以执行以下操作:

cat list | while read i
do
    year=$(echo "$i" | cut -d"/" -f6)
    day=$(echo "$i" | cut -d"/" -f7)
    fullname=$(echo "$i" | awk -F"/" '{print $NF}')
    fullnameend=$(echo "$fullname" |sed -e 's/\.mp3$/_end\.mp3/')
    new_name=$(echo "$year"_"$day"_"$fullnameend")

    # let's download
    wget -c -O "$fullname" "$i"

    # let's trim last 20 sec
    trim_nsec "$fullname" 20 "$new_name" <&3
    echo "$cpt file processed"
    #delete orig. file :
    #rm "$fullname"
    ((cpt++))

done 3<&1

如果使用双引号,则很可能存在意外全局搜索问题。看:嗯。即使shellcheck要求使用alla双引号,它仍然会在每一次迭代中失败。请您的问题反映出添加的双引号不写入临时文件,然后丢弃该临时文件也会丢失这只愚蠢的猫。grep可以简化为一个命令grep-pom4'http=[^