Bash'de komut dosyası parametreleri


103

Şu şekilde kullanılması gereken bir kabuk betiği yapmaya çalışıyorum:

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

Komut dosyası daha sonra görüntü dosyasını bir metin dosyasına dönüştürecek. İşte şimdiye kadar bulduklarım:

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

Ama -fromve -todeğerlerini nasıl elde edeceğimi bilmiyorum . Nasıl yapılacağına dair bir fikrin var mı?


Yanıtlar:


124

Eğer bir bashscript sağlamak argümanlar değişkenler görünür $1ve $2ve $3sayı argümanı ifade eder nerede. $0komutun kendisidir.

Bağımsız değişkenler boşluklarla ayrılır, bu nedenle -fromve -tokomutunu sağlarsanız , bunlar da bu değişkenlerde son bulacaktır, yani 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

Aşağıdakiler gibi -fromve öğelerini atlamak daha kolay olabilir -to:

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

O zaman sahip olacaksınız:

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

Olumsuz tarafı, doğru sırayla tedarik etmeniz gerekmesidir. Komut satırında adlandırılmış argümanları çözümlemeyi kolaylaştıran kitaplıklar vardır, ancak genellikle basit kabuk komut dosyaları için sorun yoksa sadece kolay yolu kullanmalısınız.

O zaman şunları yapabilirsiniz:

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

Sonuna çift tırnak $1ve $2her zaman gerekli değildir ancak çift tırnak arasına koydu yoksa bazı dizeleri çalışmaz, çünkü tavsiye edilmektedir.


69

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

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 sizin için uygun şekilde ayrıştıran bir programdır.

f:t:değerler içeren 2 parametre beklediğinizi belirtir (iki nokta üst üste ile gösterilir). Sadece bayrak olarak yorumlanacağını f:t:vsöyleyen bir şey -v.

optsmevcut parametrenin depolandığı yerdir. caseBunu işleyecek nerede ifadedir.

${OPTARG}parametreyi takip eden değeri içerir. ${FROM_VAL}örneğin, /home/kristoffer/test.pngkomut dosyanızı aşağıdaki gibi çalıştırırsanız değeri alır :

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

Diğerlerinin önerdiği gibi, ilk kez bash betikleri yazıyorsanız, bazı temel bilgileri gerçekten okumalısınız. Bu sadece nasıl getoptsçalıştığına dair hızlı bir öğreticiydi .


1
Bu okunabilir bir çözüm gibi görünüyor. O halde iki bayrağı nasıl belirlersiniz?
Zelphir Kaltstahl

@Zelphir, iki veya daha fazla bayrak belirtebilirsiniz, basitçe ":" işaretinden sonra gelir. Örneğin için f:t:vsolacak-f some_f -t some_t -v -s
h_s

34

Değişkenleri kullanın "$1", "$2", "$3"ve bu kadar erişim argümanları. Bunların hepsine erişmek için kullanabilir "$@"veya argüman sayısını elde edebilirsiniz $#(çok az veya çok fazla argümanı kontrol etmek yararlı olabilir).


24

Komut dosyalarımın çeşitli makineler, kabuklar ve hatta cygwin sürümleri arasında tamamen taşınabilir olduğundan emin olmam gerekiyordu. Dahası, senaryoları yazmak zorunda olduğum meslektaşlarım programcılar, bu yüzden şunu kullandım:

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: Bir launcher.shkomut dosyası da ekledim, çünkü tüm işlemin neredeyse birbirinden bağımsız birkaç adımı vardı ("yarı" diyorum, çünkü her komut dosyası kendi başına çalıştırılsa bile, genellikle hepsi birlikte çalıştırılıyordu ) ve iki gün içinde, programcı olan meslektaşlarımın yaklaşık yarısının başlatıcı dosyasını kullanamayacak kadar iyi olduğunu, "kullanımı" izlediğini veya her bir şey yaptığında görüntülenen YARDIMI okuduğunu öğrendim. yanlış ve her şeyi alt üst ediyorlardı, komut dosyalarını yanlış sırayla argümanlarla çalıştırıyorlardı ve komut dosyalarının düzgün çalışmadığından şikayet ediyorlardı. Choleric olarak, meslektaşım için uygun olduklarından emin olmak için tüm senaryolarımı elden geçirmeye karar verdim. Yukarıdaki kod segmenti ilk şeydi.


2
Bunu severim. Sonuna bir bölüm ekliyorum `else echo" Geçersiz bağımsız değişken: $ {! İ} "((i ++))
fi`

6

Bash'de $1betiğe iletilen ilk argümandır, $2ikincisi vb.

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

Böylece şunları kullanabilirsiniz:

./your_script.sh some_source_file.png destination_file.txt

Çift tırnak üzerine 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 şunu çağırın:

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

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

Çağırdığınızda foo.sh "a b", çağırır bar.sh a b(iki argüman) ve onunla foo2.sh "a b"birlikte bar.sh "a b"(1 argüman) çağırır . Bash'de parametrelerin nasıl iletildiğini ve genişletildiğini her zaman aklınızda bulundurun, bu sizi çok fazla baş ağrısından kurtaracaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.