Soru Bash'de komut dosyası parametreleri


Bunun gibi kullanılması gereken bir kabuk betiği yapmaya çalışıyorum:

ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt

Komut daha sonra görüntü dosyasını bir metin dosyasına dönüştürecektir. Şimdiye kadar geldiğim şudur:

#!/bin/bash
export HOME=/home/kristoffer
/usr/local/bin/abbyyocr9 -rl Swedish -if ???fromvalue??? -of ???tovalue??? 2>&1

Ama nasıl elde edeceğimi bilmiyorum -from ve -to değerler. Nasıl yapılacağı hakkında bir fikrin var mı?


76
2017-08-01 19:57


Menşei


Okumalısın tldp.org/LDP/Bash-Beginners-Guide/html/... - Mehul Rathod
Bu konuyla ilgili daha iyi bir gönderi: Bash'ta komut satırı argümanlarını nasıl ayrıştırabilirim? - Igor Fobia


Cevaplar:


Bir bashscript'e sağladığınız argümanlar değişkenlerde görünecektir $1 ve $2 ve $3 sayının argümana atıfta bulunduğu yer. $0 komutun kendisi.

Argümanlar boşluklarla ayrılmış, böylece -from ve -to komutta, bu değişkenlerde de sonuçlanacaklar, bunun için:

./ocrscript.sh -from /home/kristoffer/test.png -to /home/kristoffer/test.txt

Alacaksınız:

$0    # ocrscript.sh
$1    # -from
$2    # /home/kristoffer/test.png
$3    # -to
$4    # /home/kristoffer/test.txt

İhmal etmek daha kolay olabilir -from ve -to, sevmek:

ocrscript.sh /home/kristoffer/test.png /home/kristoffer/test.txt

O zaman sahip olacaksın:

$1    # /home/kristoffer/test.png
$2    # /home/kristoffer/test.txt

Olumsuz tarafı, doğru sırayla tedarik etmeniz gerektiğidir. Komut satırında adlandırılmış argümanları ayrıştırmayı kolaylaştıracak kütüphaneler vardır, ancak genellikle basit kabuk betikleri için, sadece sorun değil, kolay yolu kullanmalısınız.

Sonra yapabilecekleriniz:

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

Etrafında çift tırnak $1 ve $2 her zaman gerekli değildir, ancak tavsiye edilir, çünkü bazı tırnaklar bunları çift tırnak içine koymazsanız çalışmayacaktır.


90
2017-08-01 20:09





Seçenek adlarınız olarak "from" ve "to" kullanmaya tamamen bağlı değilseniz, bunu kullanarak uygulamak oldukça kolaydır. getopts:

while getopts f:t: opts; do
   case ${opts} in
      f) FROM_VAL=${OPTARG} ;;
      t) TO_VAL=${OPTARG} ;;
   esac
done

getopts komut satırı argümanlarını işleyen ve bunları sizin için uygun şekilde ayrıştıran bir programdır.

f:t: Değerleri içeren iki parametreyi beklediğinizi belirtir (iki nokta üst üste işaret eder). Gibi bir şey f:t:v diyor ki -v sadece bir bayrak olarak yorumlanacaktır.

opts Geçerli parametrenin saklandığı yerdir. case deyim, bunu işleyeceğiniz yerdir.

${OPTARG} parametreyi izleyen değeri içerir. ${FROM_VAL} örneğin değeri alacak /home/kristoffer/test.png senaryonuzu şöyle çalıştırırsan:

ocrscript.sh -f /home/kristoffer/test.png -t /home/kristoffer/test.txt

Diğerleri önerdiği gibi, bu ilk defa bash betikleri yazıyorsa, bazı temel bilgileri gerçekten okumalısınız. Bu sadece nasıl bir hızlı öğretici oldu getopts Eserleri.


55
2017-08-01 20:17



Bu okunabilir bir çözüm gibi görünüyor. O zaman iki bayrak nasıl belirlenir? - Zelphir
@Zelphir, bayraktan sonra ":" harfini sadece iki veya daha fazla bayrak belirtebilirsiniz. Örneğin f:t:vs olacak -f some_f -t some_t -v -s - h_s


Değişkenleri kullan "$1", "$2", "$3" ve argümanlara erişmek için. Hepsine erişmek için kullanabilirsiniz "$@"ya da argümanların sayısını almak için $# (çok az veya çok fazla argümanı kontrol etmek yararlı olabilir).


25
2017-08-01 20:13





Komut dosyalarının çeşitli makineler, kabuklar ve hatta cygwin sürümleri arasında tamamen taşınabilir olduğundan emin olmalıydım. Dahası, senaryoları yazmak zorunda olduğum meslektaşlarım programcılardır, ben de bunu kullanarak sona erdim:

for ((i=1;i<=$#;i++)); 
do

    if [ ${!i} = "-s" ] 
    then ((i++)) 
        var1=${!i};

    elif [ ${!i} = "-log" ];
    then ((i++)) 
        logFile=${!i};  

    elif [ ${!i} = "-x" ];
    then ((i++)) 
        var2=${!i};    

    elif [ ${!i} = "-p" ]; 
    then ((i++)) 
        var3=${!i};

    elif [ ${!i} = "-b" ];
    then ((i++)) 
        var4=${!i};

    elif [ ${!i} = "-l" ];
    then ((i++)) 
        var5=${!i}; 

    elif [ ${!i} = "-a" ];
    then ((i++)) 
        var6=${!i};
    fi

done;

Gerekçe: Ben bir dahil launcher.sh betik de, tüm operasyonun birbirinden yarı bağımsız olan birkaç adımı olduğu için (“quasi” diyorum), çünkü her bir betik kendi başlarına çalışabilseler de, genellikle hep birlikte koşuyorlardı. İş arkadaşlarımın yaklaşık yarısı, programcıların ve programcıların tümünün, başlatıcı dosyasını kullanmak, "kullanımı" nı takip etmek ya da yanlış bir şey yaptıkları her zaman görüntülenen YARDIM'ı okumak için çok iyi olduklarını öğrendim. her şeyin bir karmaşası, yanlış sırayla argümanlar içeren betikleri çalıştırarak ve komut dosyalarının düzgün çalışmadığından şikayet ettim. Choleric olmak için tüm senaryolarımı meslektaşlarına uygun olduklarından emin olmak için elden geçirmeye karar verdim. Yukarıdaki kod segmenti ilk şeydi.


15
2017-07-06 14:55



Bunu severim. "Else echo" bölümünde bir bölüm ekliyorum Geçersiz değişken: $ {! İ} "((i ++)) fi` - CJBS
Bu çözümü tercih ederim. okunabilir ve kullanımı kolaydır. - Christian Noel


Bash'ta $1 betiğe iletilen ilk argüman, $2 ikinci ve daha fazlası

/usr/local/bin/abbyyocr9 -rl Swedish -if "$1" -of "$2" 2>&1

Yani şunları kullanabilirsiniz:

./your_script.sh some_source_file.png destination_file.txt

Çift tırnakta açıklama;

üç senaryoyu düşünün:

# foo.sh
bash bar.sh $1

# cat foo2.sh
bash bar.sh "$1"

# bar.sh
echo "1-$1" "2-$2"

Şimdi çağır:

$ bash foo.sh "a b"
1-a 2-b

$ bash foo2.sh "a b"
1-a b 2-

Sen çağırdığında foo.sh "a b" sonra o çağırır bar.sh a b (iki argüman) ve foo2.sh "a b" o çağırır bar.sh "a b" (1 argüman). Her zaman bashta parametrelerin nasıl geçtiğini ve uzandığını aklınızdan çıkarmayın, size çok fazla başağrı kazandırır.


6
2017-08-01 20:02



Güzel! Teşekkür ederim!! - Kristoffer