Bash jika dalam satu baris

50

Saya ingin tahu bagaimana saya bisa menulis jika kondisi di dalam skrip bash pada satu baris.

Misalnya, bagaimana saya bisa menulis ini pada satu baris, dan kemudian meletakkan yang lain seperti itu di baris berikutnya?

if [ -f "/usr/bin/wine" ]; then
    export WINEARCH=win32
fi

Saya bertanya ini karena saya memiliki beberapa alias di .bashrc saya dan saya memiliki .bashrc yang sama (disinkronkan) pada beberapa sistem, tetapi saya tidak memerlukan semua alias pada setiap sistem. Saya menempatkan sebagian besar di dalamnya jika pernyataan, dan semuanya bekerja dengan baik sekarang tetapi mereka membutuhkan banyak ruang, masing-masing 3 baris ditambah garis kosong di antara mereka (saya suka membuatnya mudah terlihat)

Saya juga akan menggunakan teknik ini untuk variabel lingkungan.

Horațiu Mlendea
sumber
4
Anda juga dapat menulis[ -f "/usr/bin/wine" ] && export WINEARCH=win32
glenn jackman
3
Perlu diingat bahwa yang lebih pendek belum tentu lebih baik. Anda bisa mendapatkan kesalahan logika halus dengan operator logika shell. Pilih apa yang lebih mudah dibaca dan dikelola.
glenn jackman

Jawaban:

83

Anda akan menulisnya seperti ini:

if [ -f "/usr/bin/wine" ]; then export WINEARCH=win32; fi

Perhatikan bahwa ini juga dapat ditulis (seperti yang disarankan oleh @glennjackman):

[ -f "/usr/bin/wine" ] && export WINEARCH=win32
dr_
sumber
1
Yah itu mudah ... :) Sekarang saya merasa agak canggung untuk menanyakan hal itu. Terima kasih atas jawabannya, itu sangat membantu!
Horațiu Mlendea
7
Ada satu perbedaan. 1. ekspresi akan keluar dengan 0 status, 2. ekspresi akan keluar dengan status 0 0 jika file tidak ada. Ini dapat membuat perbedaan jika Anda menggunakan ini dalam beberapa tugas otomatis seperti penyebaran di mana keberhasilan tugas tergantung pada status keluar dari perintah.
Jānis Gruzis
@ HorațiuMlendea jelas itu mudah. jika kamu tahu caranya. Tetapi sintaksnya fiddly misalnya [1 == 1] adalah kesalahan tetapi [1 == 1] bekerja. Dan semi-titik dua. Bagaimana Anda bisa merasa canggung karena tidak mengetahui beberapa sintaks yang dirancang dengan buruk. 'Perasaan' Anda sama sekali tidak masuk akal. Ini adalah pertanyaan yang bermanfaat, meskipun sayangnya Anda tidak mengerti mengapa.
barlop
@ Balop tidak, saya benar-benar mengerti maksud Anda dan saya setuju. Hanya saja pada saat itu saya mengerti bit individual yang membentuk sintaks itu (yang dengan &&). Biasanya mudah dan intuitif untuk menyatukan semuanya, tetapi seperti yang Anda katakan, bahasa ini cukup rumit dan tidak terlalu intuitif.
Horațiu Mlendea
4

Saya juga menemukan bahwa hanya mengetikkan kompleks jika kemudian perintah lain, tekan enter, dan kemudian setelah dijalankan cukup tekan panah atas. Baris perintah akan mengulangi perintah yang diketik terakhir tentu saja tetapi dalam kasus ini menempatkan semuanya pada satu baris seperti yang Anda butuhkan. Ini cara curang, tetapi efektif.

Alan
sumber
5
Perhatikan bahwa ini mungkin tergantung pada shell Anda (dan mungkin lebih jauh pada pengaturan shell Anda). Beberapa pengujian cepat di komputer saya menunjukkan ini berfungsi di Bash (jadi miliki +1), tetapi Zsh mempertahankan jeda baris ketika kembali ke perintah sebelumnya.
8bittree