bash: Bad Substitution

#!/bin/bash

jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}

Ten skrypt bash daje mi Bad substitution błąd na Ubuntu.

Próbuję podzielić jobname Na Dwa: job_201312161447 i 0003. Daje ten błąd tylko wtedy, gdy próbuję uruchomić to na Ubuntu.

Każda pomoc będzie mile widziana.
Author: Shubham, 2013-12-16

7 answers

Domyślna powłoka (/bin/sh) w Ubuntu wskazuje na dash, a nie bash.

me@pc:~$ readlink -f $(which sh)
/bin/dash

Więc jeśli chmod +x your_script_file.sh a następnie uruchomić go z ./your_script_file.sh, lub jeśli uruchomić go z bash 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 przez dash, który nie obsługuje składni zastępowania łańcuchów.

 130
Author: Vanni Totaro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-16 16:44:24

Miałem ten sam problem. Upewnij się, że Twój skrypt nie ma

#!/bin/sh 

Na górze skryptu. Zamiast tego powinieneś dodać

#!/bin/bash
 38
Author: Guest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 19:39:26

Składnia skryptu jest poprawna i dobra.

Możliwe przyczyny awarii:

  1. Twoja {[0] } nie jest tak naprawdę bashem, ale ksh lub inną powłoką, która nie rozumie podstawienia parametrów Basha. Ponieważ twój skrypt wygląda dobrze i działa z bash. Zrób ls -l /bin/bash i sprawdź, czy to naprawdę bash, a nie sym-połączony z jakąś inną powłoką.

  2. Jeśli masz bash w systemie, to możesz wykonywać swój skrypt w niewłaściwy sposób, jak: ksh script.sh lub sh script.sh (i domyślną powłoką nie jest bash). Ponieważ masz odpowiedni shebang, jeśli masz bash ./script.sh lub bash ./script.sh powinno być w porządku.

 17
Author: P.P.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-16 16:35:11

Dla innych, które tu trafią, ta dokładna wiadomość pojawi się również podczas używania składni zmiennej env dla poleceń, na przykład ${which sh} zamiast poprawnego $(which sh)

 10
Author: Nacho Coloma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-17 09:33:52

Spróbuj uruchomić skrypt jawnie używając polecenia bash, a nie tylko wykonując go jako wykonywalny.

 4
Author: Pale Blue Dot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-16 16:18:56

Upewnij się również, że nie masz pustego ciągu dla pierwszej linii skryptu.

Czyli upewnij się #!/bin / bash jest pierwszą linijką twojego skryptu.

 1
Author: wizurd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-05 18:23:16

Both-bash lub dash-work, ale składnia musi być:

FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new
 0
Author: Hagen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-10 10:03:32