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?
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?
Yanıtlar:
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.
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 .
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.
Çı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
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
$?komut bittikten hemen sonra inceleyebilirsiniz .