#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
Ten skrypt bash daje mi zły błąd zastępowania w systemie Ubuntu. Jakakolwiek pomoc będzie doceniona.
string
bash
ubuntu
substitution
Arindam Choudhury
źródło
źródło
cut
?cut -d_ -f1,2 <<< "$jobname"
icut -d_ -f3 <<< "$jobname"
zrób tosh script.sh
, pojawia się błąd „Zła zamiana”.Odpowiedzi:
Domyślna powłoka (
/bin/sh
) w Ubuntu wskazuje nadash
niebash
.Więc jeśli
chmod +x your_script_file.sh
uruchomisz go z./your_script_file.sh
lub jeśli uruchomisz go zbash your_script_file.sh
, powinno działać dobrze.Uruchomienie go z
sh your_script_file.sh
nie zadziała, ponieważ linia hashbang zostanie zignorowana, a skrypt zostanie zinterpretowany przezdash
, który nie obsługuje składni zastępowania ciągów.źródło
/bin/bash
więc twoja odpowiedź nie pasuje ?! Gdzie czytasz, że on używa/bin/sh
lubsh script.sh
?bad substitution
i po prostu próbuję zebrać informacje, ale to pytanie nie pomaga, ponieważ zawiera zbyt mało informacji.Miałem ten sam problem. Upewnij się, że Twój skrypt nie ma
u góry skryptu. Zamiast tego powinieneś dodać
źródło
#!bin/bash
ish script.sh
nadal wyświetlał mi komunikat o błędzie. Wtedy./script.sh
działa.#!/bin/bash
również naprawi złe podstawienie .#!
linia jest używana tylko wtedy, gdy wykonujesz skrypt bezpośrednio. Jeśli używaszsh script.sh
linii jest całkowicie ignorowana.Dla innych, którzy tu przybędą, ta dokładna wiadomość pojawi się również podczas używania składni zmiennej env dla poleceń, na przykład
${which sh}
zamiast prawidłowego$(which sh)
źródło
Składnia twojego skryptu jest poprawna bash i dobra.
Możliwe przyczyny niepowodzenia:
Twoja
bash
nie jest tak naprawdę bash aleksh
czy jakaś inna powłoka, która nie rozumie parametr podstawienie atakujących za. Ponieważ twój skrypt wygląda dobrze i działa z bash. Zrobićls -l /bin/bash
i sprawdzić to naprawdę bash i nie sym-przyłączone do innego zbiornika.Jeśli masz bash w swoim systemie, być może wykonujesz swój skrypt w niewłaściwy sposób, na przykład:
ksh script.sh
lubsh script.sh
(a Twoją domyślną powłoką nie jest bash). Ponieważ masz porządny shebang, jeśli masz bash./script.sh
lubbash ./script.sh
powinno być dobrze.źródło
/bin/bash
(nie/bin/sh
) były kiedykolwiek połączone z inną powłoką.Spróbuj uruchomić skrypt jawnie, używając polecenia bash, zamiast po prostu wykonywać go jako plik wykonywalny.
źródło
sh script
ibash script
... moja sugestia :)Upewnij się również, że w pierwszym wierszu skryptu nie ma pustego ciągu.
tzn. upewnij się, że
#!/bin/bash
jest to pierwsza linia skryptu.źródło
Nie dotyczy twojego przykładu, ale możesz również otrzymać
Bad substitution
błąd w Bash dla dowolnej składni podstawiania, której Bash nie rozpoznaje. To mógłby być:bash -c '${x }'
bash -c '${x;-}'
bash -c '${x@Q}'
Przed Bash 4.4.Jeśli masz wiele podstawień w tym samym wyrażeniu, Bash może nie być zbyt pomocny w zlokalizowaniu problematycznego wyrażenia. Na przykład:
źródło
Bad substitution
więc pomyślałem, że uwzględnię przypadek, na który się natknęliśmy. (To było@Q
w Bash 4.3 ukrywając się w długim, wieloliniowym wyrażeniu.)@Q
dodaniabash-4.4
.Oba - bash lub dash - działają, ale składnia musi być następująca:
źródło
Wygląda na to, że „+ x” powoduje problemy:
źródło
Dwa razy dodawałem znak dolara w wyrażeniu z nawiasami klamrowymi w bash:
zamiast
źródło
Odkryłem, że ten problem jest spowodowany zaznaczoną odpowiedzią lub masz linię lub spację przed deklaracją bash
źródło