Bash'i birkaç gün önce öğrenmeye başladım.
grep
Bö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.
grep
Bö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 -ci
argümanlarla text
ve file.sh
ve değişken set check
değerine grep
ortamı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, check
değ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ı -q
talimat grep
verdiğ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 ci
mevcut 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)
$check
Eş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 .