#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
Skrip bash ini memberi saya kesalahan substitusi buruk di Ubuntu. Bantuan apa pun akan sangat dihargai.
string
bash
ubuntu
substitution
Arindam Choudhury
sumber
sumber
cut
?cut -d_ -f1,2 <<< "$jobname"
dancut -d_ -f3 <<< "$jobname"
membuatnyash script.sh
mendapat kesalahan "substitusi buruk".Jawaban:
Shell default (
/bin/sh
) di bawah Ubuntu menunjuk kedash
, bukanbash
.Jadi jika Anda
chmod +x your_script_file.sh
dan kemudian menjalankannya./your_script_file.sh
, atau jika Anda menjalankannyabash your_script_file.sh
, itu akan berfungsi dengan baik.Menjalankannya dengan
sh your_script_file.sh
tidak akan berfungsi karena garis hashbang akan diabaikan dan skrip akan ditafsirkan olehdash
, yang tidak mendukung sintaks substitusi string itu.sumber
/bin/bash
sehingga jawaban Anda tidak cocok ?! Di mana Anda membaca dia menggunakan/bin/sh
ataush script.sh
?bad substitution
dan saya hanya berusaha mengumpulkan informasi tetapi pertanyaan ini tidak membantu karena memiliki informasi yang terlalu sedikit.Saya memiliki masalah yang sama. Pastikan skrip Anda tidak punya
di bagian atas skrip Anda. Sebaliknya, Anda harus menambahkan
sumber
#!bin/bash
dansh script.sh
, itu masih memberi saya pesan kesalahan. Lalu./script.sh
bekerja.#!/bin/bash
juga akan memperbaiki substitusi buruk .#!
baris digunakan hanya ketika Anda menjalankan skrip Anda secara langsung. Jika Anda menggunakansh script.sh
jalur ini sepenuhnya diabaikan.Untuk orang lain yang tiba di sini, pesan persis ini juga akan muncul ketika menggunakan sintaks env variabel untuk perintah, misalnya
${which sh}
bukan yang benar$(which sh)
sumber
Sintaks skrip Anda valid dan bagus.
Kemungkinan penyebab kegagalan:
Anda
bash
bukan benar-benar bash tetapiksh
atau beberapa shell lain yang tidak mengerti substitusi parameter bash. Karena skrip Anda terlihat bagus dan berfungsi dengan bash. Lakukanls -l /bin/bash
dan periksa itu benar-benar bash dan tidak terhubung ke beberapa shell lain.Jika Anda memiliki bash di sistem Anda, maka Anda mungkin mengeksekusi skrip Anda dengan cara yang salah seperti:
ksh script.sh
ataush script.sh
(dan shell default Anda bukan bash). Karena Anda memiliki shebang yang tepat, jika Anda memiliki bash./script.sh
ataubash ./script.sh
harus baik-baik saja.sumber
/bin/bash
(tidak/bin/sh
) pernah dikaitkan dengan shell yang berbeda.Coba jalankan skrip secara eksplisit menggunakan perintah bash daripada hanya menjalankannya sebagai executable.
sumber
sh script
danbash script
... saran saya :)Juga, pastikan Anda tidak memiliki string kosong untuk baris pertama skrip Anda.
yaitu pastikan
#!/bin/bash
adalah baris paling pertama dari skrip Anda.sumber
Tidak relevan dengan contoh Anda, tetapi Anda juga bisa mendapatkan
Bad substitution
kesalahan di Bash untuk sintaksis substitusi apa pun yang tidak dikenali Bash. Ini bisa jadi:bash -c '${x }'
bash -c '${x;-}'
bash -c '${x@Q}'
sebelum Bash 4.4.Jika Anda memiliki beberapa pergantian dalam ekspresi yang sama, Bash mungkin tidak terlalu membantu dalam menentukan dengan tepat ekspresi bermasalah. Misalnya:
sumber
Bad substitution
jadi saya pikir saya akan memasukkan kasus yang kami temui. (Itu@Q
di Bash 4.3 bersembunyi dalam ekspresi multi-line yang panjang.)@Q
penambahanbash-4.4
.Keduanya - bash atau dash - berfungsi, tetapi sintaksnya harus:
sumber
Sepertinya "+ x" menyebabkan masalah:
sumber
Saya menambahkan tanda dolar dua kali dalam ekspresi dengan kurung kurawal di bash:
dari pada
sumber
Saya telah menemukan bahwa masalah ini disebabkan oleh jawaban yang ditandai atau Anda memiliki garis atau ruang sebelum deklarasi bash
sumber