#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
Bu bash betiği bana Ubuntu'da Kötü ikame hatası veriyor . Herhangi bir yardım çok takdir edilecektir.
#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
Bu bash betiği bana Ubuntu'da Kötü ikame hatası veriyor . Herhangi bir yardım çok takdir edilecektir.
cut
? cut -d_ -f1,2 <<< "$jobname"
and cut -d_ -f3 <<< "$jobname"
make it
sh script.sh
"Kötü ikame" hatası alıyor.
Yanıtlar:
/bin/sh
Ubuntu altındaki varsayılan kabuk ( ) dash
, değil bash
.
me@pc:~$ readlink -f $(which sh)
/bin/dash
Yani siz chmod +x your_script_file.sh
ve sonra onu çalıştırırsanız ./your_script_file.sh
veya birlikte çalıştırırsanız bash your_script_file.sh
, iyi çalışması gerekir.
sh your_script_file.sh
Onunla çalıştırmak işe yaramayacak çünkü hashbang satırı yok sayılacak ve betik tarafından yorumlanacak dash
, bu dize değiştirme sözdizimini desteklemiyor.
/bin/bash
Cevabınız uymuyor diye kullanıyor mu ?! Nerede o kullanıyor okuyorsun /bin/sh
ya sh script.sh
?
bad substitution
ve sadece bilgi toplamaya çalışıyorum ama bu soru yardımcı olmuyor çünkü çok az bilgi içeriyor.
Ben de aynı sorunu yaşadım. Komut dosyanızın sahip olmadığından emin olun.
#!/bin/sh
senaryonuzun en üstünde. Bunun yerine eklemelisiniz
#!/bin/bash
#!bin/bash
ve sh script.sh
hala bana hata mesajını verdi. Sonra ./script.sh
çalışır.
#!/bin/bash
de düzeltecektir .
#!
satır yalnızca betiğinizi doğrudan çalıştırdığınızda kullanılır. sh script.sh
Hat kullanırsanız tamamen göz ardı edilir.
Buraya gelenler için, bu tam mesaj, komutlar için env değişken sözdizimi kullanıldığında da görünecektir, örneğin ${which sh}
doğru yerine$(which sh)
Komut dosyası söz diziminiz geçerli bir bash ve iyi.
Başarısızlığın olası nedenleri:
Sizin bash
gerçekten bash değil, ksh
ya da bash'ın parametre değiştirmesini anlamayan başka bir kabuk. Çünkü betiğiniz iyi görünüyor ve bash ile çalışıyor. Yapın ls -l /bin/bash
ve kontrol edin, gerçekten bash ve başka bir kabuğa sym-bağlı değil.
Sisteminizde bash varsa, komut dosyanızı yanlış şekilde çalıştırıyor olabilirsiniz: ksh script.sh
veya sh script.sh
(ve varsayılan kabuğunuz bash değildir). Düzgün bir shebang yaptığınız için, eğer bashınız varsa ./script.sh
veya bash ./script.sh
iyi olmalıysanız .
/bin/bash
(olmasaydı /bin/sh
) şaşırırdım.
Komut dosyasını çalıştırılabilir olarak çalıştırmak yerine açıkça bash komutunu kullanarak çalıştırmayı deneyin.
sh script
ve bash script
... önerim :)
Örneğinizle ilgili değildir, ancak Bad substitution
Bash'in tanımadığı herhangi bir ikame sözdizimi için Bash'de hata alabilirsiniz . Bu olabilir:
bash -c '${x }'
bash -c '${x;-}'
bash -c '${x@Q}'
Bash 4.4 önce.Aynı ifadede birden fazla ikameniz varsa, Bash sorunlu ifadeyi tam olarak belirlemede çok yardımcı olmayabilir. Örneğin:
$ bash -c '"${x } multiline string
$y"'
bash: line 1: ${x } multiline string
$y: bad substitution
Bad substitution
bu yüzden karşılaştığımız davayı da dahil edeceğimi düşündüm. ( @Q
Bash 4.3'te uzun çok satırlı bir ifadede saklanıyordu.)
Her ikisi de - bash veya tire - çalışır, ancak sözdiziminin şöyle olması gerekir:
FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new
Görünüşe göre "+ x" sorunlara neden oluyor:
root@raspi1:~# cat > /tmp/btest
#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
root@raspi1:~# chmod +x /tmp/btest
root@raspi1:~# /tmp/btest
root@raspi1:~# sh -x /tmp/btest
+ jobname=job_201312161447_0003
/tmp/btest: 4: /tmp/btest: Bad substitution
Ahmed ve RavinderSingh13'e katılıyorum Benzer bir sorunla karşılaştım ve bazı komut dosyalarımın ilk satırında "#! / Bin / bash" dan hemen önce bir beyaz boşluk olduğunu gördüm. Bu boşluğun nasıl göründüğünü hiç anlamadım ama tüm senaryomun herhangi bir satırın başında en az bir boşluk var
Bu sorunun ya işaretli cevaptan kaynaklandığını ya da bash bildiriminden önce bir satır ya da boşluk olduğunu buldum.