GNU/Linux >> Belajar Linux >  >> Linux

Skrip Bash Shell - Periksa bendera dan ambil nilainya

Coba shFlags -- Pustaka flag baris perintah lanjutan untuk skrip shell Unix.

http://code.google.com/p/shflags/

Ini sangat bagus dan sangat fleksibel.

TIPE BENDERA:Ini adalah daftar DEFINE_* yang dapat Anda lakukan. Semua bendera menggunakan nama, nilai default, string bantuan, dan nama 'pendek' opsional (nama satu huruf). Beberapa flag memiliki argumen lain, yang dijelaskan dengan flag.

DEFINE_string:menerima input apa pun, dan mengartikannya sebagai string.

DEFINE_boolean:biasanya tidak menerima argumen apa pun:ucapkan --myflag untuk setFLAGS_myflag menjadi true, atau --nomyflag untuk menyetel FLAGS_myflag menjadi false. Sebagai alternatif, Anda dapat mengatakan--myflag=true atau --myflag=t atau --myflag=0 or--myflag=false atau --myflag=f atau --myflag=1Meneruskan opsi memiliki pengaruh yang sama dengan meneruskan opsi satu kali.

DEFINE_float:mengambil input dan mengartikannya sebagai angka floating point. Asshell tidak mendukung float per-se, input hanya divalidasi sebagai nilai floating point yang valid.

DEFINE_integer:mengambil masukan dan menafsirkannya sebagai bilangan bulat.

BENDERA KHUSUS:Ada beberapa tanda yang memiliki arti khusus:--help (atau -?) mencetak daftar semua tanda dengan cara yang dapat dibaca manusia--flagfile=foo membaca tanda dari foo. (belum diimplementasikan)-- seperti pada getopt(), menghentikan pemrosesan flag

CONTOH PENGGUNAAN:

-- begin hello.sh --
 ! /bin/sh
. ./shflags
DEFINE_string name 'world' "somebody's name" n
FLAGS "[email protected]" || exit $?
eval set -- "${FLAGS_ARGV}"
echo "Hello, ${FLAGS_name}."
-- end hello.sh --

$ ./hello.sh -n Kate
Hello, Kate.

Catatan:Saya mengambil teks ini dari dokumentasi shflags


Berikut adalah antarmuka argumen perintah umum yang dapat Anda tempelkan ke bagian atas semua skrip Anda.

#!/bin/bash

declare -A flags
declare -A booleans
args=()

while [ "$1" ];
do
    arg=$1
    if [ "${1:0:1}" == "-" ]
    then
      shift
      rev=$(echo "$arg" | rev)
      if [ -z "$1" ] || [ "${1:0:1}" == "-" ] || [ "${rev:0:1}" == ":" ]
      then
        bool=$(echo ${arg:1} | sed s/://g)
        booleans[$bool]=true
        echo \"$bool\" is boolean
      else
        value=$1
        flags[${arg:1}]=$value
        shift
        echo \"$arg\" is flag with value \"$value\"
      fi
    else
      args+=("$arg")
      shift
      echo \"$arg\" is an arg
    fi
done


echo -e "\n"
echo booleans: ${booleans[@]}
echo flags: ${flags[@]}
echo args: ${args[@]}

echo -e "\nBoolean types:\n\tPrecedes Flag(pf): ${booleans[pf]}\n\tFinal Arg(f): ${booleans[f]}\n\tColon Terminated(Ct): ${booleans[Ct]}\n\tNot Mentioned(nm): ${boolean[nm]}"
echo -e "\nFlag: myFlag => ${flags["myFlag"]}"
echo -e "\nArgs: one: ${args[0]}, two: ${args[1]}, three: ${args[2]}"

Dengan menjalankan perintah:

bashScript.sh firstArg -pf -myFlag "my flag value" secondArg -Ct: thirdArg -f

Outputnya adalah ini:

"firstArg" is an arg
"pf" is boolean
"-myFlag" is flag with value "my flag value"
"secondArg" is an arg
"Ct" is boolean
"thirdArg" is an arg
"f" is boolean


booleans: true true true
flags: my flag value
args: firstArg secondArg thirdArg

Boolean types:
    Precedes Flag(pf): true
    Final Arg(f): true
    Colon Terminated(Ct): true
    Not Mentioned(nm): 

Flag: myFlag => my flag value

Args: one => firstArg, two => secondArg, three => thirdArg

Pada dasarnya, argumen dibagi menjadi flag boolean dan argumen generik. Dengan melakukannya dengan cara ini, pengguna dapat meletakkan flag dan boolean di mana saja selama dia menyimpan argumen generik (jika ada) dalam urutan yang ditentukan.

Mengizinkan saya dan sekarang Anda untuk tidak pernah berurusan dengan penguraian argumen bash lagi!

Anda dapat melihat skrip yang diperbarui di sini

Ini sangat berguna selama setahun terakhir. Sekarang dapat mensimulasikan ruang lingkup dengan mengawali variabel dengan parameter ruang lingkup.

Panggil saja script seperti

replace() (
  source $FUTIL_REL_DIR/commandParser.sh -scope ${FUNCNAME[0]} "[email protected]"
  echo ${replaceFlags[f]}
  echo ${replaceBooleans[b]}
)

Sepertinya saya belum mengimplementasikan cakupan argumen, tidak yakin mengapa saya rasa saya belum membutuhkannya.


Gunakan $# untuk mengambil jumlah argumen, jika tidak sama dengan 2, argumen yang disediakan tidak cukup:

if [ $# -ne 2 ]; then
   usage;
fi

Selanjutnya, periksa apakah $1 sama dengan -t , jika tidak, bendera yang tidak dikenal digunakan:

if [ "$1" != "-t" ]; then
  usage;
fi

Terakhir simpan $2 di FLAG :

FLAG=$2

Catatan:usage() adalah beberapa fungsi yang menunjukkan sintaks. Misalnya:

function usage {
   cat << EOF
Usage: script.sh -t <application>

Performs some activity
EOF
   exit 1
}

Anda harus membaca tutorial getopts ini.

Contoh dengan -a sakelar yang membutuhkan argumen :

#!/bin/bash

while getopts ":a:" opt; do
  case $opt in
    a)
      echo "-a was triggered, Parameter: $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

Seperti kata greybot(getopt !=getopts ):

Perintah eksternal getopt(1) tidak pernah aman digunakan, kecuali Anda tahu itu adalah GNU getopt, Anda menyebutnya dengan cara khusus GNU, dan Anda memastikan bahwa GETOPT_COMPATIBLE tidak ada di lingkungan. Gunakan getopts (shellbuiltin) sebagai gantinya, atau cukup lewati parameter posisional.


Linux
  1. Script Shell Dengan Fungsi Dan Parameter Sebagai Variabel?

  2. Eof Tak Terduga Saat Mencari Yang Cocok `”‘ – Bash Script?

  3. Periksa konektivitas basis data menggunakan skrip Shell

  1. Skrip Bash:Menggunakan perintah skrip dari skrip bash untuk mencatat sesi

  2. Periksa validitas IP

  3. Cakupan variabel untuk skrip bash shell dan fungsi dalam skrip

  1. Panduan Bash For Loop dan Contohnya

  2. Bagaimana cara memeriksa apakah ada file di direktori tertentu dalam skrip bash?

  3. Perbedaan antara perintah dalam skrip bash dan perintah di terminal