Saya mencoba membandingkan string dalam bash. Saya sudah menemukan jawaban tentang cara melakukannya di stackoverflow . Dalam skrip yang saya coba, saya menggunakan kode yang dikirimkan oleh Adam dalam pertanyaan yang disebutkan:
#!/bin/bash
string='My string';
if [[ "$string" == *My* ]]
then
echo "It's there!";
fi
needle='y s'
if [[ "$string" == *"$needle"* ]]; then
echo "haystack '$string' contains needle '$needle'"
fi
Saya juga mencoba pendekatan dari ubuntuforums yang dapat Anda temukan di pos ke-2
if [[ $var =~ regexp ]]; then
#do something
fi
Dalam kedua kasus saya menerima kesalahan:
[[: not found
Apa yang saya lakukan salah?
bash
shell
ubuntu-11.04
string-comparison
pengguna1581900
sumber
sumber
/bin/bash --version
dicetak?[
tidak akan berfungsi dalam kasus ini, karena tidak mendukung pola.Jawaban:
[[
adalah bash-builtin./bin/bash
Tampaknya Anda bukan bash yang sebenarnya.Dari komentar:
Tambahkan
#!/bin/bash
di bagian atas filesumber
/bin/bash -c "type [["
?#!/bin/bash
di bagian atas file sayash
, banyak frustrasi. Sekarang saya hanya perlu mengulang semua yang saya undid sebelum menemukan jawaban ini.Bagaimana Anda menjalankan skrip Anda? Jika Anda melakukannya dengan
Kamu harus mencobanya:
atau, jika skrip dapat dieksekusi:
sh dan bash adalah dua cangkang yang berbeda . Sementara dalam kasus pertama Anda menyerahkan skrip Anda sebagai argumen ke penerjemah sh, dalam kasus kedua Anda memutuskan baris pertama penerjemah mana yang akan digunakan.
sumber
sh myscript.sh
, karena/bin/sh
mengemulasi shell Bourne di mana[[
bukan builtin. Namun, menjalankan skrip via./script.sh
seharusnya tidak menghasilkan kesalahan, karena dalam hal itu shebang harus menyebabkan/bin/bash
digunakan.Apakah baris pertama dalam skrip Anda:
atau
shell sh menghasilkan pesan kesalahan ini, bukan bash
sumber
Saya memiliki masalah ini ketika menginstal Heroku Toolbelt
Inilah cara saya memecahkan masalah
Seperti yang Anda lihat, / bin / sh adalah tautan ke "dash" (bukan bash), dan
[[
ini adalah bash sintaksis gula. Jadi saya baru saja mengganti tautan ke / bin / bash. Hati-hati menggunakan rm seperti ini di sistem Anda!sumber
sh
untuk distro Anda adalah IMHO yang keliru. Shell yang dijalankan dengansh
harus bekerja dengandash
; jika tidak, itu bug dalam skrip. Jika Anda membutuhkanbash
fitur, gunakanbash
, bukansh
.update-alternatives
(di debian-based-linux) seperti ini justinconover.wordpress.com/2012/05/14/… tetapi pada akhirnya, itu akan sama.Seperti yang disebutkan @Ansgar,
[[
adalah bashism, yaitu dibangun ke dalam Bash dan tidak tersedia untuk shell lainnya. Jika Anda ingin skrip Anda portabel, gunakan[
. Perbandingan juga membutuhkan sintaks yang berbeda: ubah==
menjadi=
.sumber
Tentukan bash alih-alih sh saat menjalankan skrip. Saya pribadi memperhatikan mereka berbeda di bawah ubuntu 12.10:
bash script.sh arg0 ... argn
sumber