Bagaimana cara mengekstrak status keluar suatu perintah ke dalam variabel?

14

Saya mulai belajar Bash beberapa hari yang lalu.

Saya mencoba mendapatkan status keluar grepekspresi ke dalam variabel seperti ini:

check=grep -ci 'text' file.sh

dan output yang saya dapatkan adalah

No command '-ic' found

Haruskah saya melakukannya dengan perintah pipa?

omri gilhar
sumber
6
Untuk status keluar, Anda dapat memeriksa $?segera setelah perintah selesai.
coffeMug
dan Anda dapat memeriksa array PIPESTATUS jika Anda menginginkan status salah satu perintah dalam sebuah pipa.
cas

Jawaban:

26

Perintahmu,

check=grep -ci 'text' file.sh

akan ditafsirkan oleh shell sebagai "jalankan perintah -cidengan argumen textdan file.sh, dan atur variabel checkke nilai grepdi lingkungannya".


Shell menyimpan nilai keluar dari perintah yang paling baru dieksekusi dalam variabel ?. Anda dapat menetapkan nilainya ke salah satu variabel Anda sendiri seperti ini:

grep -i 'PATTERN' file
check=$?

Jika Anda ingin bertindak berdasarkan nilai ini, Anda bisa menggunakan checkvariabel Anda :

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

atau Anda dapat melewati menggunakan variabel terpisah dan harus memeriksa $?semuanya bersama-sama:

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

(perhatikan -q, ia memerintahkan grepuntuk tidak mengeluarkan apa pun dan keluar segera setelah sesuatu cocok; kami tidak benar-benar tertarik dengan apa yang cocok di sini)

Atau, jika Anda hanya ingin "melakukan sesuatu" ketika polanya tidak ditemukan:

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

Menyimpan $?ke variabel lain hanya diperlukan jika Anda perlu menggunakannya nanti, ketika nilai dalam $?telah ditimpa, seperti pada

mkdir "$dir"
err=$?

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

Dalam cuplikan kode di atas, $?akan ditimpa oleh hasil [ "$err" -ne 0 ] && [ ! -d "$dir" ]tes. Menyimpannya di sini benar-benar hanya perlu jika kita perlu menampilkannya dan menggunakannya exit.

Kusalananda
sumber
4

Pertanyaan Anda tidak jelas tetapi berdasarkan pada kode yang Anda kirimkan, sepertinya Anda ingin variabel checkuntuk menyimpan status keluar dari grepperintah. Cara untuk melakukan ini adalah dengan menjalankan

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

Saat menjalankan perintah dari shell, status keluarnya tersedia melalui parameter shell khusus $?,.

Ini didokumentasikan oleh POSIX (standar untuk sistem operasi mirip Unix) dalam spesifikasinya untuk shell dan implementasi Bash didokumentasikan dalam Parameter Khusus .

Karena Anda seorang pelajar baru, saya sangat menyarankan Anda mulai dengan buku yang bagus dan / atau tutorial online untuk mendapatkan dasar-dasarnya. Rekomendasi sumber daya eksternal tidak disarankan di situs Stack Exchange tapi saya sarankan Lhunath dan GreyCat's Bash Guide .

Anthony G - keadilan untuk Monica
sumber
4

Anda telah memberi tahu bash untuk mengatur variabel check=grepdi lingkungan yang diteruskannya ke perintah

-ci 'text' file.sh

tetapi citidak ada.

Saya percaya Anda bermaksud melampirkan perintah itu dalam kutu-belakang, atau dalam tanda kurung yang diawali dengan tanda dolar, yang salah satu dari mereka akan menentukan jumlah berapa banyak baris 'teks' ditemukan pada (case insensitive) dalam file:

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

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

Sekarang $checkharus 0 jika tidak ada yang cocok, atau positif jika ada yang cocok.

Monty Harder
sumber
1

Bingung mengapa menggunakan -c saat memeriksa output? Ini digunakan untuk memeriksa berapa kali sesuatu dicocokkan - tidak apakah itu berhasil atau tidak.

   -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.)

tetapi dalam contoh ini

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

Itu tidak menghasilkan apa pun kecuali kode keluar, yang kemudian digaungkan. Ini adalah output yang digunakan pemeriksaan variabel. Saya juga lebih suka karena itu satu baris.

Anda dapat mengganti --silent dengan -q. Saya menggunakannya karena Anda tidak tertarik dengan output grep, hanya apakah itu berfungsi atau tidak.

   -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
Miati
sumber
1

Cara yang benar untuk menetapkan output dari perintah grep ke variabel adalah sebagai @ monty-hard disebutkan:

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

Meskipun untuk menetapkan status keluar dari perintah ini ke variabel, Anda harus menggunakan parameter shell $?tepat setelah menjalankan perintah seperti yang ditunjukkan di bawah ini:

grep -ci 'text' file.sh
check=$?
echo $check
Ingin tahu
sumber