#!/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/shUbuntu altındaki varsayılan kabuk ( ) dash, değil bash.
me@pc:~$ readlink -f $(which sh)
/bin/dash
Yani siz chmod +x your_script_file.shve sonra onu çalıştırırsanız ./your_script_file.shveya birlikte çalıştırırsanız bash your_script_file.sh, iyi çalışması gerekir.
sh your_script_file.shOnunla ç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/bashCevabınız uymuyor diye kullanıyor mu ?! Nerede o kullanıyor okuyorsun /bin/shya sh script.sh?
bad substitutionve 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/bashve sh script.shhala 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.shHat 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 bashgerçekten bash değil, kshya 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/bashve 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.shveya 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.shveya bash ./script.shiyi 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 scriptve bash script... önerim :)
Örneğinizle ilgili değildir, ancak Bad substitutionBash'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 substitutionbu yüzden karşılaştığımız davayı da dahil edeceğimi düşündüm. ( @QBash 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.