是否可以将这个bash循环更改为case语句?
我在一个帮助台工作,我使用这个脚本来查找我在工作中一直需要的信息。 这节省了我一点时间,这是一次很好的学习经历。我对脚本编写非常陌生,关于这个脚本的任何反馈都会得到很好的接受。我真正需要帮助的是这个循环 一般反馈也欢迎是否可以将这个bash循环更改为case语句?,bash,loops,switch-statement,Bash,Loops,Switch Statement,我在一个帮助台工作,我使用这个脚本来查找我在工作中一直需要的信息。 这节省了我一点时间,这是一次很好的学习经历。我对脚本编写非常陌生,关于这个脚本的任何反馈都会得到很好的接受。我真正需要帮助的是这个循环 一般反馈也欢迎 # If more than one member in Array Ask for user input. if [[ ${tLen} -gt '1' ]]; then for (( i=0; i<${tLen}; i++ )); do # adding
# 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"
老实说,我不完全理解你的问题;但听起来您需要的是中描述的select命令,它为用户提供了一个可供选择的编号项目菜单。在您的情况下,您可以写:
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"
是的,这就是我的意思。。。非常感谢。我会在有机会的时候测试这个。我想我把另一门编程课上的a学期弄混了。。。我建议你在更多的地方使用双引号。不带引号的参数扩展会经历分词和文件名扩展,这很少是任何人想要的。但有趣的是,在一些使用双引号的地方,我认为单引号更合适。确实\n是一个反斜杠,后跟n,但是“\n”是一个更直接的表达方式。