2017-01-05 33 views
1

的脚本是:需要替代readarray脚本/映射文件旧系统上

#!/bin/bash 

# Dynamic Menu Function 
createmenu() { 
    select selected_option; do # in "[email protected]" is the default 
     if [ 1 -le "$REPLY" ] && [ "$REPLY" -le $(($#)) ]; then 
      break; 
     else 
      echo "Please make a vaild selection (1-$#)." 
     fi 
    done 
} 

declare -a drives=(); 
# Load Menu by Line of Returned Command 
mapfile -t drives < <(lsblk --nodeps -o name,serial,size | grep "sd"); 
# Display Menu and Prompt for Input 
echo "Available Drives (Please select one):"; 
createmenu "${drives[@]}" 
# Split Selected Option into Array and Display 
drive=($(echo "${selected_option}")); 
echo "Drive Id: ${drive[0]}"; 
echo "Serial Number: ${drive[1]}"; 

老系统没有mapfilereadarray所以我需要到该行转换为某种替代方案,可以读取每一行将lsblk输出到一个数组中。

创建数组中的问题,该生产线是:

mapfile -t drives < <(lsblk --nodeps -o name,serial,size | grep "sd"); 

回答

3

您可以循环在你的输入和追加到数组:

$ while IFS= read -r line; do arr+=("$line"); done < <(printf '%d\n' {0..5}) 
$ declare -p arr 
declare -a arr='([0]="0" [1]="1" [2]="2" [3]="3" [4]="4" [5]="5")' 

或者,您的具体情况:

while IFS= read -r line; do 
    drives+=("$line") 
done < <(lsblk --nodeps -o name,serial,size | grep "sd") 

查看BashFAQ/001为什么IFS= read -r是一个好主意:它确保空白是保留的,反斜杠序列不被解释。