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
bash
shell-script
Buzu
sumber
sumber
#!/bin/bash
Jawaban:
Anda menjalankan skrip yang ditulis untuk bash under sh , yang tidak memiliki banyak fitur sintaks yang diperluas -
[[
adalahbash
perintah bawaan dan tidak tersedia dish
.Ubah
#!/bin/sh
ke#!/bin/bash
atau ke#!/usr/bin/env bash
.sumber
/bin/sh
adalah symlink ke/bin/bash
. Dan itu mungkin cukup aman untuk mengasumsikan bahwabash
adalah/bin/bash
./bin/bash
di sebagian besar sistem Linux, tetapi/usr/pkg/bin/bash
pada BSD, atau/usr/local/bin/bash
jika seseorang mengkompilasi langsung dari sumber./usr/bin/env
peretasan (yang menggunakan mana yangbash
kebetulan berada di penelepon$PATH
saat ini), tetapi YMMV. (Dan Anda dapat membuat/bin/bash
symlink - jika Anda memiliki hak admin dan Anda tidak keberatan mengacaukannya/bin
.)/usr/local
adalah 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.Tentukan bash alih-alih sh saat menjalankan skrip. Saya pribadi memperhatikan mereka berbeda di bawah ubuntu 12.10:
bash script.sh arg0 ... argn
sumber