Apa tujuan dari "&&" dalam perintah shell?

Jawaban:

399

&&memungkinkan Anda melakukan sesuatu berdasarkan apakah perintah sebelumnya berhasil diselesaikan - itu sebabnya Anda cenderung melihatnya dirantai sebagai do_something && do_something_else_that_depended_on_something.

girasquid
sumber
391

Selain itu, Anda juga memiliki ||yang logis atau, dan juga ;yang hanya pemisah yang tidak peduli apa yang terjadi pada perintah sebelumnya.

$ false || echo "Oops, fail"
Oops, fail

$ true || echo "Will not be printed"
$  

$ true && echo "Things went well"
Things went well

$ false && echo "Will not be printed"
$

$ false ; echo "This will always run"
This will always run

Beberapa perincian tentang ini dapat ditemukan di sini Daftar Perintah di Bash Manual.

plundra
sumber
5
Mungkin Anda ingin menambahkan false && echo "Will not be printed".
MTSan
112

command-line - apa tujuannya &&?

Di shell, ketika Anda melihat

$ command one && command two

maksudnya adalah untuk mengeksekusi perintah yang mengikuti &&hanya jika perintah pertama berhasil. Ini idiomatis dari kerang Posix, dan tidak hanya ditemukan di Bash.

Ini bermaksud untuk mencegah jalannya proses kedua jika yang pertama gagal.

Anda mungkin memperhatikan bahwa saya telah menggunakan kata "niat" - itu untuk alasan yang bagus. Tidak semua program memiliki perilaku yang sama, jadi agar ini berfungsi, Anda perlu memahami apa yang dianggap sebagai "kegagalan" program dan bagaimana cara menanganinya dengan membaca dokumentasi dan, jika perlu, kode sumber.

Shell Anda menganggap nilai pengembalian 0 untuk true, angka positif lainnya untuk false

Pengembalian program a sinyal saat keluar. Mereka harus mengembalikan 0 jika berhasil keluar, atau lebih besar dari nol jika tidak. Ini memungkinkan sejumlah komunikasi antara proses.

Ini &&disebut sebagai AND_IFdalam tata bahasa shell posix , yang merupakan bagian dari and_ordaftar perintah, yang juga termasuk|| yang merupakan OR_IFdengan semantik serupa.

Simbol tata bahasa, dikutip dari dokumentasi:

%token  AND_IF    OR_IF    DSEMI
/*      '&&'      '||'     ';;'    */

Dan Tata Bahasa (juga dikutip dari dokumentasi), yang menunjukkan bahwa sejumlah AND_IFs ( &&) dan / atau OR_IFs ( ||) dapat dirangkai (seperti and_oryang didefinisikan secara rekursif):

and_or           :                         pipeline
                 | and_or AND_IF linebreak pipeline
                 | and_or OR_IF  linebreak pipeline

Kedua operator memiliki prioritas yang sama dan dievaluasi dari kiri ke kanan (mereka asosiatif kiri). Seperti yang dikatakan para dokter:

Sebuah AND-ORdaftar adalah urutan satu atau lebih jaringan pipa dipisahkan oleh operator "&&"dan"||" .

Daftar adalah urutan satu atau lebih daftar AND-OR yang dipisahkan oleh operator ';'dan '&'dan secara opsional diakhiri oleh ';','&' atau.

Operator "&&"dan "||"harus memiliki hak yang sama dan harus dievaluasi dengan asosiasi kiri. Sebagai contoh, kedua perintah berikut menulis semata-mata untuk keluaran standar:

$ false && echo foo || echo bar
$ true || echo foo && echo bar
  1. Dalam kasus pertama, false adalah perintah yang keluar dengan status 1

    $ false
    $ echo $?
    1

    yang berarti echo footidak berjalan (yaitu, shortcircuiting echo foo). Kemudian perintah echo bardieksekusi.

  2. Dalam kasus kedua, true keluar dengan kode 0

    $ true
    $ echo $?
    0

    dan karena echo fooitu tidak dieksekusi, maka echo bardieksekusi.

Aaron Hall
sumber
31

Penggunaan yang cukup umum untuk '&&' adalah mengkompilasi perangkat lunak dengan autotool. Sebagai contoh:

./configure --prefix=/usr && make && sudo make install

Pada dasarnya jika konfigurasi berhasil, make dijalankan untuk dikompilasi, dan jika itu berhasil, make dijalankan sebagai root untuk menginstal program. Saya menggunakan ini ketika saya kebanyakan yakin bahwa hal-hal akan bekerja, dan itu memungkinkan saya untuk melakukan hal-hal penting lainnya seperti melihat stackoverflow dan tidak 'memantau' kemajuan.

Kadang-kadang saya benar-benar terbawa ...

tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf

Saya melakukan ini ketika misalnya membuat linux dari kotak awal.

Nigel Atkinson
sumber
2
Bagus dalam REPL, tetapi untuk skrip saya lebih suka set -o errexituntuk Bash.
Franklin Yu
19

&&perintah string bersama. Perintah yang berurutan hanya dijalankan jika yang sebelumnya berhasil.

Demikian pula, || akan memungkinkan perintah berturut-turut untuk mengeksekusi jika sebelumnya gagal.

Lihat Pemrograman Bash Shell .

Dean Burge
sumber
8

Lihat contohnya:

mkdir test && echo "Something" > test/file

Shell akan mencoba membuat direktori testdan kemudian, hanya jika berhasil akan mencoba membuat file di dalamnya.

Jadi, Anda dapat menginterupsi urutan langkah jika salah satunya gagal.

alno
sumber
8

Ini untuk mengeksekusi pernyataan kedua jika pernyataan pertama berakhir dengan sukses. Seperti pernyataan if:

 if (1 == 1 && 2 == 2)
  echo "test;"

Yang pertama mencoba jika 1 == 1, jika itu benar ia memeriksa jika 2 == 2

Nick
sumber
1
Bisakah seseorang menjelaskan mengapa ini diturunkan untuk pengguna yang tersandung pada pertanyaan?
user3243242
1
@ user3243242 tidak salah, hanya contoh yang buruk untuk menggambarkan penggunaan&&
dan
Ini adalah wawasan tentang bagaimana iftes bekerja di bash. Saya tidak pernah menganggapnya sebagai rantai perintah perbandingan, memutuskan ketika salah satu dari mereka gagal. Jadi, Anda mendapatkan upvote saya :)
PiRK
1
Konsekuensinya adalah bahwa Anda bisa mendapatkan perilaku yang berlawanan dengan menggunakan ||, untuk eei || leu || uie || echo prout3 || echo "never executed"
menghubungkan
7

command_1 && command_2: jalankan command_2 hanya ketika command_1 dijalankan dengan sukses.

command_1 || command_2: jalankan command_2 hanya ketika command_1 tidak berhasil dieksekusi.

Rasanya mirip dengan bagaimana kondisi 'jika' dieksekusi dalam bahasa pemrograman arus utama, seperti, dalam if (condition_1 && condition_2){...}kondisi_2 akan dihilangkan jika kondisi_1 adalah falsedan dalam if (condition_1 || condition_2){...}kondisi_2 akan dihilangkan jika kondisi_1 adalah true. Lihat, itu trik yang sama yang Anda gunakan untuk coding :)

Xiaonin Li
sumber
Saya tidak tahu apa yang Anda maksud dengan 'justru sebaliknya', tetapi $ echo '1' || echo '2' hanya mencetak '1'. dan $ wrong_command || echo '2' mencetak pesan kesalahan dan '2' di baris berikutnya. Bisakah Anda menjelaskan sedikit tentang apa yang menurut Anda salah tentang itu?
Xiaonin Li
huh, aku tentu terlalu lelah kemarin. maaf untuk itu, itu hanya saya: / Saya perlu Anda mengedit sesuatu dalam jawaban Anda jika Anda ingin saya upvote (untuk membuat jawaban Anda 0, sekarang stackoverflow minta edit jadi saya tidak bisa)
Arount
@Arunt, tidak apa-apa jangan khawatir. Jadi saya baru saja mengirimkan hasil edit. jadi apakah Anda dapat menghapus suara turun sekarang?
Xiaonin Li
ya, sekali lagi, maaf, sungguh
Arount
0
####################### && or (Logical AND) ######################
first_command="1"
two_command="2"

if [[ ($first_command == 1) && ($two_command == 2)]];then
 echo "Equal"
fi

Ketika program memeriksa apakah perintah, maka program membuat angka yang disebut kode keluar, jika kedua kondisi tersebut benar, kode keluar adalah nol (0), jika tidak, kode keluar adalah angka positif. hanya ketika menampilkan Equal jika kode keluar dihasilkan nol (0) yang berarti kedua kondisi tersebut benar.

Amin
sumber
Selamat datang di stackoverflow. Pastikan snipet kode Anda berfungsi sebelum memposting di sini. Anda harus memperbaikinyaif [[ ($first_command == "1") && ($two_command == "2") ]];then echo "Equal"; fi
Zheng Qu
1
Terima kasih @ ZhengQu atas perintah Anda, Itu sudah selesai.
Amin