Объединение строк внутри скрипта bash (поведение отличается от оболочки)

#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 . В любом случае, ответа хмонтолиу было достаточно. Я попытался создать скрипт из оболочки, и это сработало. Как я уже сказал, это может быть любая ошибка при использовании другого редактора.