Bash Dialog表单未填写字段无法获取空字符串问题求助
解决Bash dialog表单未填写字段无法获取空字符串的问题
dialog的--form选项会按字段顺序返回每个值(每行一个),但直接用ENGINE=($(dialog ...))赋值数组时,Bash会按空白字符分割输出,空行(未填写的字段)会被忽略,导致数组长度不足,丢失未填写的位置。
修正方案1:用read命令按行读取数组
通过设置IFS=$'\n'让read按行分割输出,保留空行作为空字符串存入数组:
function searchEngine() { exec 3>&1 # 按行读取dialog输出,存入数组,保留空值 IFS=$'\n' read -r -d '' -a ENGINE < <(dialog --clear --ok-label "Submit" \ --title "Search Engine" \ --form "Search" \ 15 50 0 \ "1 :" 1 1 "${ENGINE[0]}" 1 20 30 0 \ "2 :" 2 1 "${ENGINE[1]}" 2 20 30 0 \ "3 :" 3 1 "${ENGINE[2]}" 3 20 30 0 \ "4 :" 4 1 "${ENGINE[3]}" 4 20 30 0 \ 2>&1 1>&3) exec 3>&- } searchEngine # 输出数组所有元素,空字段显示为空字符串 echo "${ENGINE[@]}" # 查看数组长度,始终为4 echo "数组长度:${#ENGINE[@]}"
修正方案2:循环逐行读取并补全数组
如果需要更稳妥的处理(比如防止dialog输出异常),可以用循环逐行读取,最后补全数组长度至字段数:
function searchEngine() { exec 3>&1 ENGINE=() # 逐行读取dialog输出,添加到数组 while IFS= read -r line; do ENGINE+=("$line") done < <(dialog --clear --ok-label "Submit" \ --title "Search Engine" \ --form "Search" \ 15 50 0 \ "1 :" 1 1 "${ENGINE[0]}" 1 20 30 0 \ "2 :" 2 1 "${ENGINE[1]}" 2 20 30 0 \ "3 :" 3 1 "${ENGINE[2]}" 3 20 30 0 \ "4 :" 4 1 "${ENGINE[3]}" 4 20 30 0 \ 2>&1 1>&3) exec 3>&- # 补全数组至4个元素,确保未填写字段对应空字符串 while [ "${#ENGINE[@]}" -lt 4 ]; do ENGINE+=("") done } searchEngine echo "${ENGINE[@]}" echo "数组长度:${#ENGINE[@]}"
关键说明
- 原代码的问题:
ENGINE=($(dialog ...))依赖Bash的单词分割,会忽略空行(未填写的字段),导致数组元素缺失。 - 两种方案都通过按行读取的方式保留了dialog的所有输出行,空行被解析为空字符串存入数组,确保每个字段位置都有对应的值(空或填写内容)。
内容的提问来源于stack exchange,提问作者rhadamanthe
相关产品推荐
相关产品推荐

