Bash数组无法输出值:摄像头RTSP流结果存储异常排查
问题描述
用户拥有4个摄像头,想要将每个摄像头RTSP流的检测结果存入空数组,之后读取数组元素。执行脚本后,echo ${outputcodes[0]}与echo ${outputcodes}均无输出;但循环内echo $streamresults能得到正确的0值。尝试过outputcodes+=($streamresults)及不同数组声明方式都无效,使用的Bash版本为4.2.46(2)-release,原脚本如下:
# streams to check streams=("rtsp://Streaming/Channels/01" "rtsp://Streaming/Channels/201" "rtsp://Streaming/Channels/301" "rtsp://Streaming/Channels/401") # declare array for stream codes declare -a outputcodes for stream in "${streams[@]}"; do streamoutput=$(timeout 20s ffprobe -v quiet -print_format json -show_streams $stream) # get output code for each stream streamresults=$(jq -r '.streams[0].index' <<< "$streamoutput") # add stream result to array outputcodes+=$streamresults done exit 0 # get first array member result echo ${outputcodes[0]}
问题原因
- 数组追加语法错误:原脚本用
outputcodes+=$streamresults是把内容直接追加到数组第一个元素的末尾,而非添加新的数组元素。正确的数组追加语法需要用括号包裹元素,写成outputcodes+=("$streamresults")。 - 脚本提前退出:循环结束后立刻执行
exit 0,导致后续的echo ${outputcodes[0]}语句根本不会被执行,这是无输出的核心原因。
修正后的脚本
# streams to check streams=("rtsp://Streaming/Channels/01" "rtsp://Streaming/Channels/201" "rtsp://Streaming/Channels/301" "rtsp://Streaming/Channels/401") # declare array for stream codes declare -a outputcodes for stream in "${streams[@]}"; do streamoutput=$(timeout 20s ffprobe -v quiet -print_format json -show_streams "$stream") # get output code for each stream streamresults=$(jq -r '.streams[0].index' <<< "$streamoutput") # add stream result to array outputcodes+=("$streamresults") done # get first array member result echo ${outputcodes[0]} # 打印整个数组验证所有元素 echo "${outputcodes[@]}" exit 0
修正说明
- 移除了循环后的
exit 0,确保后续的输出语句能正常执行; - 将数组追加语句改为
outputcodes+=("$streamresults"),正确向数组添加新元素; - 给ffprobe的
$stream变量添加引号,避免URL中存在特殊字符时出现解析错误; - 新增打印整个数组的语句,方便验证所有检测结果是否正确存入数组。
内容的提问来源于stack exchange,提问作者overflowed
相关产品推荐
相关产品推荐

