#linux #bash #string
#linux #bash #строка
Вопрос:
Я пробую некоторый staff, который работает идеально, когда я пишу его в обычной оболочке, но когда я включаю его в файл скрипта bash, это не так. Первый пример:
m=`date %m`
m_1=$((m-1))
echo $m_1
Это дает мне значение за последний месяц (фактический минус один), но не работает, если оно выполняется из скрипта.
Второй пример:
m=6
m=$m"t"
echo m
Это возвращает «6t» в оболочке (объединяет $ m с «t»), но просто выдает мне «t» при выполнении из скрипта.
Я предполагаю, что опытный пользователь Linux может легко ответить на все эти вопросы, но я просто учусь по ходу дела.
Заранее спасибо.
Ответ №1:
Повторно проверьте свой синтаксис.
Ваш первый фрагмент кода работает либо из командной строки, из bash, либо из sh, поскольку ваш синтаксис допустим sh. На мой взгляд, у вас, вероятно, есть опечатки в вашем файле скрипта:
~$ m=`date %m`; m_1=$((m-1)); echo $m_1
4
~$ cat > foo.sh
m=`date %m`; m_1=$((m-1)); echo $m_1
^C
~$ bash foo.sh
4
~$ sh foo.sh
4
То же самое может применяться к другому фрагменту с исправлениями:
~$ m=6; m=$m"t"; echo $m
6t
~$ cat > foo.sh
m=6; m=$m"t"; echo $m
^C
~$ bash foo.sh
6t
~$ sh foo.sh
6t
Комментарии:
1. Хорошо, извините, я пробовал с «cat», и это работает отлично, как вы говорите. Возможно, возникла какая-то проблема с моим редактором (Crimson). Большое спасибо.
2. @Rorro; полезно знать. Вы можете отметить ответ как допустимый. Спасибо.
Ответ №2:
Убедитесь, что первая строка вашего скрипта
#!/bin/bash
вместо
#!/bin/sh
Bash включит свои расширенные функции, только если будет явно запущен как bash
. Если запустить как sh
, он будет работать в режиме совместимости с POSIX.
Комментарии:
1. Да, первая строка — «#!/bin/ bash», я забыл сказать, и это тоже не работает…
2. проверьте мой ответ. Это не проблема с bash / sh, поскольку его полностью допустимый синтаксис sh. Оператору необходимо просмотреть любую опечатку, которую он, возможно, допустил в своих сценариях. Код, который он публикует, является допустимым (за исключением опечатки во втором фрагменте кода)
3. @hmontoliu: Я полагал, что это опечатка в сообщении — OP утверждает, что вывод второго фрагмента должен быть
t
, а неm
.
Ответ №3:
Прежде всего, у меня это отлично работает в скрипте и на терминале. Во-вторых, ваша последняя строка echo m
просто выведет «m». Я думаю, вы имели в виду «$ m»..
Комментарии:
1. Да, я исправил $ m, моя ошибка:D . В любом случае, ответа хмонтолиу было достаточно. Я попытался создать скрипт из оболочки, и это сработало. Как я уже сказал, это может быть любая ошибка при использовании другого редактора.