Mengapa saya mendapatkan [[: tidak ditemukan Saat Menjalankan Skrip?

15

Saya mencoba menulis skrip yang harus memeriksa apakah ada file. Di konsol saya menulis

if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

dan saya mengerti

not mod

tetapi ketika saya menulis skrip untuk melakukan hal yang sama:

#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

dan kemudian jalankan skrip, saya mendapatkan ini:

./ex.sh: 2: [[: not found
mod

Saya menyimpan skrip pada direktori saat ini dan menamakannya ex.sh, kemudian saya memastikan itu dapat dieksekusi. Untuk memanggil skrip saya melakukan ini:

./ex.sh

Mengapa saya mendapatkan masalah ini? Saya sudah mencoba banyak hal:

if [ -a /home ...

dan

if test -a /home ...

Keduanya kembali

13: -a: unexpected operator
Buzu
sumber
Saya dapat membuatnya bekerja, tetapi untuk itu saya harus menghapus baris pertama (#! / Bin / sh) Apakah Anda tahu mengapa ini terjadi?
Buzu
coba#!/bin/bash
kev
halo kev, saya menikmatinya juga. Saya baru saja memperbarui pertanyaan saya. Saya menghabiskan terlalu banyak waktu untuk hal ini, tetapi saya senang bisa menyelesaikannya. Terima kasih atas jawaban anda. Memang, solusi untuk masalah itu.
Buzu
@Kev Silakan posting itu sebagai jawaban
slhck
Buzu, @Kev - jika Anda menemukan jawaban, posting sebagai jawaban di bawah ini , jangan edit pertanyaannya.
user1686

Jawaban:

9

Anda menjalankan skrip yang ditulis untuk bash under sh , yang tidak memiliki banyak fitur sintaks yang diperluas - [[adalah bashperintah bawaan dan tidak tersedia di sh.

Ubah #!/bin/shke #!/bin/bashatau ke #!/usr/bin/env bash.

kev
sumber
Pada beberapa sistem, /bin/shadalah symlink ke /bin/bash. Dan itu mungkin cukup aman untuk mengasumsikan bahwa bashadalah /bin/bash.
Keith Thompson
@Keith: Ada /bin/bashdi sebagian besar sistem Linux, tetapi /usr/pkg/bin/bashpada BSD, atau /usr/local/bin/bashjika seseorang mengkompilasi langsung dari sumber.
user1686
@grawity: Atau di mana pun Anda memutuskan untuk meletakkannya jika Anda kompilasi dari sumber. Ok, bagus. Secara pribadi, saya lebih suka mengedit shebang untuk setiap sistem daripada menggunakan /usr/bin/envperetasan (yang menggunakan mana yang bashkebetulan berada di penelepon $PATHsaat ini), tetapi YMMV. (Dan Anda dapat membuat /bin/bashsymlink - jika Anda memiliki hak admin dan Anda tidak keberatan mengacaukannya /bin.)
Keith Thompson
@Keith: /usr/localadalah tempat autotools memutuskan untuk meletakkannya secara default. Sejauh "secara pribadi", saya suka memiliki beberapa server dan VM yang berbeda dari repositori script / tools yang sama, dan tidak perlu mengedit ulang shebang pada setengah dari mereka setelah setiap komit.
user1686
tak satu pun dari mereka yang bekerja untuk saya: / im on centos
astroanu
0

Tentukan bash alih-alih sh saat menjalankan skrip. Saya pribadi memperhatikan mereka berbeda di bawah ubuntu 12.10:

bash script.sh arg0 ... argn

Smeterlink
sumber