SORU
10 EKİM 2008, Cuma


Nasıl bash komut satırı argümanları ayrıştırmak mı?

Bu hat ile çağrılan bir senaryo var ki:

./myscript -vfd ./foo/bar/someFile -o /fizz/someOtherFile

ya da bu:

./myscript -v -f -d -o /fizz/someOtherFile ./foo/bar/someFile 

Ne şekilde kabul ayrıştırma bu şekilde her durumda (veya ikisinin birleşimi) $v, $f $d Tüm ayarlanmış true ve $outFile olacak eşit /fizz/someOtherFile?

CEVAP
7 Ocak 2013, PAZARTESİ


Tercih edilen Yöntem: getopt[s] Kullanmadan düz bash

Ben aslında OP sorulan her soruya cevap verdi. Bu S/A ilgi çok oluyor, ayrıca bunu yapmak için büyü dışı şekilde teklif etmeliyim. guneysus's answer üzerine kötü sed düzeltme ve Tobias Kienzler's suggestion içerecek şekilde genişletmek için gidiyorum.

Anahtar değer çifti bağımsız değişkenleri geçirmek için en yaygın yolu iki:

Düz Bash Boşlukla Ayrılmış

Kullanımı 12**

#!/bin/bash
# Use > 1 to consume two arguments per pass in the loop (e.g. each
# argument has a corresponding value to go with it).
# Use > 0 to consume one or more arguments per pass in the loop (e.g.
# some arguments don't have a corresponding value to go with it such
# as in the --default example).
# note: if this is set to > 0 the /etc/hosts part is not recognized ( may be a bug )
while [[ $# > 1 ]]
do
key="$1"

case $key in
    -e|--extension)
    EXTENSION="$2"
    shift # past argument
    ;;
    -s|--searchpath)
    SEARCHPATH="$2"
    shift # past argument
    ;;
    -l|--lib)
    LIBPATH="$2"
    shift # past argument
    ;;
    --default)
    DEFAULT=YES
    ;;
    *)
            # unknown option
    ;;
esac
shift # past argument or value
done
echo FILE EXTENSION  = "${EXTENSION}"
echo SEARCH PATH     = "${SEARCHPATH}"
echo LIBRARY PATH    = "${LIBPATH}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)
if [[ -n $1 ]]; then
    echo "Last line of file specified as non-opt/last argument:"
    tail -1 $1
fi

Düz Bash Ayrılmış Eşittir

#!/bin/bash

for i in "$@"
do
case $i in
    -e=*|--extension=*)
    EXTENSION="${i#*=}"
    shift # past argument=value
    ;;
    -s=*|--searchpath=*)
    SEARCHPATH="${i#*=}"
    shift # past argument=value
    ;;
    -l=*|--lib=*)
    LIBPATH="${i#*=}"
    shift # past argument=value
    ;;
    --default)
    DEFAULT=YES
    shift # past argument with no value
    ;;
    *)
            # unknown option
    ;;
esac
done
echo "FILE EXTENSION  = ${EXTENSION}"
echo "SEARCH PATH     = ${SEARCHPATH}"
echo "LIBRARY PATH    = ${LIBPATH}"
echo "Number files in SEARCH PATH with EXTENSION:" $(ls -1 "${SEARCHPATH}"/*."${EXTENSION}" | wc -l)
if [[ -n $1 ]]; then
    echo "Last line of file specified as non-opt/last argument:"
    tail -1 $1
fi

Daha iyi "this guide." Alt Temizleme için ${i#*=} arama anlamak için İşlevsel olarak gereksiz bir alt süreci `echo "$i" | sed 's/[^=]*=//'` aramalar `sed 's/[^=]*=//' <<< "$i"` eşdeğerdirikigereksiz alt işlemler.

Kullanarak getopt[s]

kimden: http://mywiki.wooledge.org/BashFAQ/035#getopts

Hiç getopt(1) kullanın.getopt boş argümanlar ele gömülü boşluk içeren dizeler, ya da bağımsız olamaz. Onun varlığını unutma lütfen.

POSIX kabuk (ve diğerleri) yerine kullanmak için güvenli getopts sunuyoruz. Burada getopts basit bir örnek:

#!/bin/sh

# A POSIX variable
OPTIND=1         # Reset in case getopts has been used previously in the shell.

# Initialize our own variables:
output_file=""
verbose=0

while getopts "h?vf:" opt; do
    case "$opt" in
    h|\?)
        show_help
        exit 0
        ;;
    v)  verbose=1
        ;;
    f)  output_file=$OPTARG
        ;;
    esac
done

shift $((OPTIND-1))

[ "$1" = "--" ] && shift

echo "verbose=$verbose, output_file='$output_file', Leftovers: $@"

# End of file

getopts avantajları:

  1. Taşınabilir, örneğin çizgi çalışacak.
  2. Beklenen Unıx şekilde -vf filename gibi şeyler, otomatik olarak işleyebilir.

getopts dezavantajı kısa seçenekleri (-h, --help) hile olmadan işleyebilir.

Sözdizimi ve tüm değişkenleri demek istediğini açıklıyor getopts tutorial var. Bash da bilgilendirici olabilir help getopts var.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 3biblecom

    3biblecom

    23 NİSAN 2011
  • infiniTuts

    infiniTuts

    18 Ocak 2012
  • Peyton

    Peyton

    28 Aralık 2008