2017-01-03 26 views
-3

if文を下に凝縮しようと考えていますが、基本的にはコードを可能な限り縮小しています。if文の範囲の最適化の考え方

データを取得するためにこれをファイルから取得していますが、これはコードに含まれていますが、そのままでコードを縮小できますか?

`

#! /bin/bash 
shopt -s nocasematch extglob 
callsign() { 
    while true; do 
     read -ep "Insert your call sign: " input 
     if [[ $input = [aknw]@(|[a-z])[0-9][a-z]@(|[a-z]@(|[a-z])) ]]; then 
     break 
     else 
     echo "please insert valid call sign." 
     fi 
    done 
clear 
CAC 
} 
function CAC() { 
ping -c 1 "www.google.com" &> /dev/null && lynx --dump http://callsign.ualr.edu/cdetail.php?call=$input|grep -ve '^ ' || CallsignDetails 
CCyn 
} 
function CCyn() { 
while true; do 
     read -p "Would you like to Lookup another callsign [y/n]" yn 
     case $yn in 
      [Yy]*) Last;; 
      [Nn]*) exit;; 
      *) echo "please answer yes or no.";; 
     esac 
    done 
} 
function Save() { 
cat <<log>> CallSign.log 
$(ping -c 1 "www.google.com" &> /dev/null && lynx --dump http://callsign.ualr.edu/cdetail.php?call=$input|grep -ve '^ ' || CallsignDetails) 
____________________________________________ 
log 
callsign 
} 
function Last() { 
while true; do 
     read -p "Would you like to Log The Last callsign [y/n]" yn 
     case $yn in 
      [Yy]*) Save;; 
      [Nn]*) callsign;; 
      *) echo "please answer yes or no.";; 
     esac 
    done 
} 
function CallsignDetails() { 
CsT=$(echo $input | awk '{print toupper($0)}') 
clear 
LC_ALL=C grep -w $CsT l_amat/HD.dat | tail -1 | awk -F '|' '{print $5}' 
echo "" 
LC_ALL=C grep -w $CsT l_amat/EN.dat | tail -1 | awk -F '|' '{print $8}' 
echo "" 
LC_ALL=C grep -w $CsT l_amat/EN.dat | tail -1 | awk -F '|' '{print $16}' 
echo "" 
echo "$(echo $(LC_ALL=C grep -w $CsT l_amat/EN.dat | tail -1 | awk -F '|' '{print $17}'), $(LC_ALL=C grep -w $CsT l_amat/EN.dat | awk -F '|' '{print $18, $19}'))" 
echo "" 
echo "" 
PClass="$(LC_ALL=C grep -w $CsT -w l_amat/AM.dat | tail -1 | awk -F '|' '{print $17}')" 
Class="$(grep -w $CsT l_amat/AM.dat | tail -1 | awk -F '|' '{print $6}')" 
if [ "$Class" == "E" ];then 
echo "Class: Extra" 
else 
if [ "$Class" == "G" ];then 
echo "Class: General" 
else 
if [ "$Class" == "A" ];then 
echo "Class: Advanced" 
else 
if [ "$Class" == "P" ];then 
echo "Class: Technician Plus" 
else 
if [ "$Class" == "N" ];then 
echo "Class: Novice" 
else 
if [ "$Class" == "T" ];then 
echo "Class: Technician" 
else 
if [ "$Class" != "T" ];then 
echo "Class: Unknown" 
fi 
fi 
fi 
fi 
fi 
fi 
fi 
if [ "$PClass" == "E" ];then 
echo "Previous Class: Extra" 
else 
if [ "$PClass" == "G" ];then 
echo "Previous Class: General" 
else 
if [ "$PClass" == "A" ];then 
echo "Previous Class: Advanced" 
else 
if [ "$PClass" == "P" ];then 
echo "Previous Class: Technician Plus" 
else 
if [ "$PClass" == "N" ];then 
echo "Previous Class: Novice" 
else 
if [ "$PClass" == "T" ];then 
echo "Previous Class: Technician" 
else 
if [ "$PClass" != "T" ];then 
echo "Previous Class: N/a" 
fi 
fi 
fi 
fi 
fi 
fi 
echo "Previous Callsigns: $(LC_ALL=C grep -w $CsT l_amat/AM.dat | tail -1 | awk -F '|' '{print $16}')" 
LStatus="$(LC_ALL=C grep $CsT -w l_amat/HD.dat | tail -1 | awk -F '|' '{print $6}')" 
if [ "$LStatus" == "A" ];then 
echo "License status: Active" 
else 
if [ "$LStatus" == "C" ];then 
echo "License status: Canceled" 
else 
if [ "$LStatus" == "E" ];then 
echo "License status: Expired" 
fi 
fi 
fi 
echo "Grant date: $(LC_ALL=C grep -w $CsT l_amat/HD.dat | tail -1 | awk -F '|' '{print $8}')" 
echo "Expiration date: $(LC_ALL=C grep -w $CsT l_amat/HD.dat | tail -1 | awk -F '|' '{print $9}')" 
fi 
CCyn 
} 
callsign` 
+0

だから、あなたはすべての可能な値のためにその長いパイプラインを繰り返すことが最適であると思いますか?あなたはそれを一度やってその価値を保存しませんか? – John3136

+1

私はそれが失敗した変数にしようとするたびに、http://codereview.stackexchange.com/ – John3136

+0

に属しているので、この質問をオフトピックとして閉じるように投票しています。どうしようとしましたか?Class = $(LC_ALL = C grep -w $ CsT l_amat/AM.dat | awk -F '|' '{print $ 6}') – Hugo0Boss

答えて

0

私はそれを行うには「正しい」方法を呼びたいかを示す前に、私は現在のコードを改善したいいくつかの変化の可能性を指摘してみましょう。まず、変数に結果を格納し、あなたの比較でそれを使用:

Class=$(LC_ALL=C grep -w $CsT l_amat/AM.dat | awk -F '|' '{print $6}') 
if [ "$Class" == "E" ];then 
    ... 

第二に、予期しない単語の分割とワイルドカードの展開からそれらを保護するために($CsTのような)変数参照の周りに二重引用符を使用します。

Class=$(LC_ALL=C grep -w "$CsT" l_amat/AM.dat | awk -F '|' '{print $6}') 

Class=$(LC_ALL=C grep -w "$CsT" l_amat/AM.dat | awk -F '|' '{print $6}') 
if [ "$Class" == "E" ];then 
    echo "Class: Extra" 
elif [ "$Class" == "G" ];then 
    echo "Class: General" 
elif [ "$Class" == "G" ];then 
    ... 
fi # Note: only a single `fi` needed to close off the whole thing! 

文がelse ifを使用した場合に第三に、代わりに深くネストされた、一本の長い多くの条件にif文を作るためにelifを使用

また、移植性のため[ ]テストの中で==の代わりに=を使用することをお勧めします。 bashは両方を受け入れますが、シェルの中には=しか受け付けないものもあります。 bash(汎用のPOSIXシェルではない)用に書いているのであれば、[ ]より一般的には[[ ]]が優先されます。

しかし、それはマイナーな調整です。シェルは可能な値(またはパターン)の束に対して単一の文字列を比較するために特別に構築があります:case文は:

Class=$(LC_ALL=C grep -w "$CsT" l_amat/AM.dat | awk -F '|' '{print $6}') 
case "$Class" in 
    E) echo "Class: Extra";; 
    G) echo "Class: General";; 
    A) echo "Class: Advanced";; 
    ... 
    *) echo "Class: Unknown";; 
esac 
関連する問題