2013-05-31 2 views
0

Я работаю в службе поддержки, и я использую этот скрипт для поиска информации, которую мне нужно все время на моей работе. Это экономит мне немного времени, и это было отличное обучение. Я довольно новичок в написании сценариев, и любые отзывы об этом скрипте будут хорошо восприняты. Мне бы очень хотелось помочь в этом цикле.Можно ли изменить эту петлю bash на регистр case?

Общая информация приветствуется.

# If more than one member in Array Ask for user input. 
if [[ ${tLen} -gt '1' ]]; then 
    for ((i=0; i<${tLen}; i++)); 
    do 
    # adding one so user selection starts at 1 
    # gobble up everything up to last back slash. 
    echo "$(($i + 1))) ${arr[$i]##*/}" 
    done 

Можно ли превратить это в регистр случаев, чтобы защитить от ошибочного ввода пользователем? Также будет отличный способ обработки ошибочного ввода пользователем. Спасибо заранее за любые данные!

#!/bin/bash 

# Asking for serial number 
echo -e "Enter serial number:" 
read SerialNumber 
SerialNumberCount=${#SerialNumber} 
if [[ ${SerialNumberCount} > "11" ]]; then 
    # If Serial is 12 or more characters, set the ModelSerial to four digits 
    ModelSerial=$(echo $SerialNumber|awk '{ print substr($0, length($0) - 3, length($0)) }') 
else 
    # Set serial to three characters 
    ModelSerial=$(echo $SerialNumber|awk '{ print substr($0, length($0) - 2, length($0)) }') 
fi 
# Set ModelURL based on length of Serial number 

# Creating temp dir/file trap for parsing html 
TMPDIR=${TMPDIR:-/tmp} 
temporary_dir=$(mktemp -d "$TMPDIR/XXXXXXXXXXXXXXXXXXXXXXXXXXXXX") || { echo "ERROR creating a temporary file" >&2; exit 1; } 
trap 'rm -rf "$temporary_dir"' 0 
trap 'exit 2' 1 2 3 15 
temp="$temporary_dir/$RANDOM-$RANDOM-$RANDOM" 

# First downloaded html page 
lookupUrl=$(echo "http://everymac.com/ultimate-mac-lookup/?search_keywords=${ModelSerial}") 
curl -s -o $temp -L $lookupUrl  

# Parsing partial links 
webRslt=$(cat $temp | grep -o '<a href=['"'"'"][^"'"'"']*['"'"'"]' | sed -e 's/^<a href=["'"'"']//' -e 's/["'"'"']$//'|grep /systems* |grep ".html") 

# Creating Array of partial links 
arr=($webRslt)  

# Length of Array 
tLen=${#arr[@]} 

# If more than one member in Array Ask for user input. 
if [[ ${tLen} -gt '1' ]]; then 
    for ((i=0; i<${tLen}; i++)); 
    do 
    # adding one so user selection starts at 1 
    # gobble up everything up to last back slash. 
    echo "$(($i + 1))) ${arr[$i]##*/}" 
    done 

    # Ask user for input 
    printf "\n" 
    echo "Please enter 1-${tLen} --> " 
    read -r sel 
    # Subtracting one from selection for correct Array member 
    ArraySel=$((sel - 1)) 
    curl "${arr["$ArraySel"]/#/http://everymac.com}" -s -o "$temp" 
else 
    # If array only has one member do this... 
    curl "${arr[0]/#/http://everymac.com}" -s -o "$temp" 
fi 
clear 

# Parsing html for screen printing 
get_value() { perl -nE 'say $1 if m!>\Q'"$1"'\E</td>\s*<td[^>]+>([^<]+)<!' <"$temp"; } 
VAR1=$(get_value "Apple Model No:") 
VAR2=$(get_value "Apple Order No:") 
VAR3=$(get_value "Model ID:") 
VAR4=$(get_value "Processor Speed:") 
VAR5=$(get_value "Standard RAM:") 
VAR6=$(get_value "Maximum RAM:") 
VAR7=$(get_value "RAM Type:") 
VAR8=$(get_value "Pre-Installed MacOS:") 
VAR9=$(get_value "Maximum MacOS:") 
VAR10=$(get_value "Minimum Windows:") 
VAR11=$(get_value "Maximum Windows:") 
VAR12=$(get_value "Original Price (US):") 
tput setaf 2 
printf "\033[1mRam & Apple Model Information Information (experimental beta)\033[m\n\n" 
printf "Apple Model No:\t\\t\033[1m$VAR1\033[m\n" 
printf "Apple Order No::\t\033[1m$VAR2\033[m\n" 
printf "Model ID:\t\\t\033[1m$VAR3\033[m\n" 
printf "Processor Speed:\t\033[1m$VAR4\033[m\n" 
printf "Standard RAM:\t\\t\033[1m$VAR5\033[m\n" 
printf "Maximum RAM:\t\\t\033[1m$VAR6\033[m\n" 
printf "RAM Type:\t\\t\033[1m$VAR7\033[m\n" 
printf "Pre-Installed MacOS:\t\033[1m$VAR8\033[m\n" 
printf "Maximum MacOS::\t\t\033[1m$VAR9\033[m\n" 
printf "Minimum Windows:\t\033[1m$VAR10\033[m\n" 
printf "Maximum Windows:\t\033[1m$VAR11\033[m\n" 
printf "Original Price (US):\t\033[1m$VAR12\033[m\n" 
printf "\n\n" 
printf "See URL below for more details." 
printf "\n\n" 

# Print page that is being parsed on screen. 
if [[ ${tLen} -gt '1' ]]; then 
    tput setaf 2 
    echo "${arr[$ArraySel]/#/http://everymac.com}" 
else 
    tput setaf 2 
    echo "${arr[0]/#/http://everymac.com}" 
fi 
printf "\n\n" 
+0

Я рекомендую вам использовать двойные кавычки в большем количестве мест. Расширения без кавычек претерпевают расщепление слов и расширение имени файла, что редко кто хочет. (Но, как ни странно, в некоторых местах, в которых вы используете двойные кавычки, я думаю, что одно кавычки будут более подходящими. Верно, что '' \ n "' является обратным слэшем, за которым следует 'n', но' '\ n'' - более простой способ выразить это.) – ruakh

ответ

1

Если честно, я не совсем понимаю ваш вопрос; но похоже, что вам нужна команда select (описано в §3.2.4.2 "Conditional Constructs" of the Bash Reference Manual), в которой представлено меню нумерованных элементов для пользователей. В вашем случае вы можете написать:

if ((${#arr[@]} == 1)) ; then 
    url="${arr[0]}" 
else 
    # present the user with all elements of the array, numbered, 
    # and store the selected element in $url: 
    select url in "${arr[@]}" ; do break ; done 
fi 
curl "${url/#/http://everymac.com}" -s -o "$temp" 
+0

Да, это то, что я имел в виду ... Спасибо. Я проверю это, когда у меня появится шанс. Я думаю, что я смешивал свой термин с другим классом программирования ... lol – user1787331

Смежные вопросы