Bir komutun çıkış durumunu bir değişkene nasıl çıkarır?


14

Bash'i birkaç gün önce öğrenmeye başladım.

grepBöyle bir değişkene ifade çıkış durumu elde etmeye çalışıyorum :

check=grep -ci 'text' file.sh

ve elde ettiğim çıktı

No command '-ic' found

Pipo komutuyla yapmalı mıyım?


6
Çıkış durumu için $?komut bittikten hemen sonra inceleyebilirsiniz .
coffeMug

ve bir ardışık düzendeki komutlardan birinin durumunu istiyorsanız PIPESTATUS dizisini inceleyebilirsiniz.
cas

Yanıtlar:


26

Emriniz,

check=grep -ci 'text' file.sh

olarak kabuk tarafından yorumlanacak "komutunu çalıştırın -ciargümanlarla textve file.shve değişken set checkdeğerine greportamındaki".


Kabuk, en son yürütülen komutun çıkış değerini değişkene depolar ?. Değerini aşağıdaki gibi kendi değişkenlerinizden birine atayabilirsiniz:

grep -i 'PATTERN' file
check=$?

Bu değer üzerinde işlem yapmak istiyorsanız, checkdeğişkeninizi kullanabilirsiniz :

if [ "$check" -eq 0 ]; then
    # do things for success
else
    # do other things for failure
fi

veya ayrı bir değişken kullanarak ve $?hepsini birlikte incelemek zorunda kalabilirsiniz :

if grep -q -i 'pattern' file; then
  # do things (pattern was found)
else
  # do other things (pattern was not found)
fi

(bir şeyin eşleştiği anda hiçbir şey çıktılamamayı ve çıkmayı -qtalimat grepverdiğini unutmayın ; burada eşleşenlerle gerçekten ilgilenmiyoruz)

Sadece istiyorsanız desen olduğunda Ya da "şeyler yapmak" değil bulundu:

if ! grep -q -i 'pattern' file; then
  # do things (pattern was not found)
fi

$?Başka bir değişkene kaydetme , yalnızca daha sonra kullanmanız gerektiğinde, içindeki değerin $?üzerine yazıldığında,

mkdir "$dir"
err=$?

if [ "$err" -ne 0 ] && [ ! -d "$dir" ]; then
    printf 'Error creating %s (error code %d)\n' "$dir" "$err" >&2
    exit "$err"
fi

Yukarıdaki kod snippet'inde, test $?sonucu üzerine yazılır [ "$err" -ne 0 ] && [ ! -d "$dir" ]. Burada kaydetmek gerçekten sadece onu görüntülememiz ve kullanmamız gerektiğinde gereklidir exit.


4

Sorunuz net değil, ancak gönderdiğiniz koda bağlı olarak, değişkenin komutun checkçıkış durumunu depolamasını istiyorsunuz gibi görünüyor grep. Bunu yapmanın yolu koşmaktır

grep -ci 'text' file.sh
check=$?

Kabuktan bir komut çalıştırırken, çıkış durumu özel kabuk parametresi,, aracılığıyla kullanılabilir $?.

Bu, kabuk için spesifikasyonunda POSIX (Unix benzeri işletim sistemleri standardı) tarafından belgelenmiştir ve Bash uygulaması Özel Parametreler altında belgelenmiştir .

Yeni bir öğrenci olduğunuzdan, temel bilgileri edinmek için iyi bir kitap ve / veya çevrimiçi öğretici ile başlamanızı şiddetle tavsiye ederim. Dış kaynak önerileri Stack Exchange sitelerinde önerilmez, ancak Lhunath ve GreyCat'ın Bash Rehberini öneriyorum .


4

Bash'a check=grep, komuta ilettiği ortamdaki değişkeni ayarlamasını söylediniz

-ci 'text' file.sh

ama cimevcut değil.

Bu komutu geri kenelere veya dolar işaretinden önce gelen parantezlere dahil etmeyi düşündüğünüze inanıyorum. İkisinden biri dosyada kaç satır 'metin' bulunduğuna (büyük / küçük harf duyarsız) sayım atayacaktır:

check=`grep -ci 'text' file.sh`

check=$(grep -ci 'text' file.sh)

$checkEşleşme yoksa şimdi 0 veya eşleşme varsa pozitif olmalıdır.


1

Çıktıyı kontrol ederken neden -c kullanmanızın kafası karıştı? Bir şeyin kaç kez eşleştiğini kontrol etmek için kullanılır - başarılı olup olmadığını değil.

   -c, --count
          Suppress normal output; instead print a count of matching  lines
          for  each  input  file.  With the -v, --invert-match option (see
          below), count non-matching lines.  (-c is specified by POSIX.)

ama bu örnekte

check="$(grep --silent -i 'text' file.sh; echo $?)"

Çıkış kodu dışında hiçbir şey çıkarmaz, bu kod daha sonra yankılanır. Bu, değişken kontrolünün kullandığı çıktıdır. Bunu da tercih ediyorum çünkü tek bir satır.

--Silent öğesini -q ile değiştirebilirsiniz. Grep çıktısıyla ilgilenmediğiniz için kullanıyorum, sadece işe yarayıp yaramadığı.

   -q, --quiet, --silent
          Quiet;  do  not  write  anything  to  standard   output.    Exit
          immediately  with  zero status if any match is found, even if an
          error was detected.  Also see the -s  or  --no-messages  option.
          (-q is specified by POSIX.)

$ check=$(echo test | grep -qi test; echo $?) # check variable is now set
$ echo $check
0
$ check=$(echo null | grep -qi test; echo $?)
$ echo $check
1

1

Bir değişkene grep komutunun çıktısını atamanın doğru yolu @ monty-harder'den daha zordur:

check=`grep -ci 'text' file.sh`
check=$(grep -ci 'text' file.sh)

Bu komutun çıkış durumunu bir değişkene atamanıza rağmen, $?aşağıda gösterildiği gibi komutu uyguladıktan hemen sonra shell parametresini kullanmanız gerekir :

grep -ci 'text' file.sh
check=$?
echo $check
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.