2014-11-24 4 views
1

Если я установил переменную в сценарии оболочки, а затем попытаюсь использовать ее для создания другой переменной, она, похоже, не будет правильно заменена. Пример:bash: переменная не расширяется, как ожидалось

#!/bin/bash 
X=/software/xxx 
echo variable X = $X 
echo path using variable: $X/yyy 
echo path without variable: /software/xxx/yyy 

В этом выходы:

variable X = /software/xxx 
/yyy using variable: /software/xxx 
path without variable: /software/xxx/yyy 

я ожидал второй выходной линии, чтобы быть:

path using variable: /software/xxx/yyy 

Я попробовал различные комбинации цитат и с помощью $ {X}, но все безрезультатно.

Я новичок в сценарии оболочки (исходя из фона Windows), поэтому я уверен, что есть что-то действительно простое, что я здесь отсутствует.

В случае, если кто-нибудь задается вопросом, почему я хочу это сделать, то на этом фоне мне нужно написать сценарий оболочки, который принимает параметр относительного пути, определяет его абсолютное имя пути, а затем устанавливает CLASSPATH с несколькими файлами jar в что каталог перед вызовом программы Java:

#!/bin/bash 
DIR=`readlink -fn $1` 
export CLASSPATH=$DIR/x.jar:$DIR/y.jar 
java progname 
+2

Цитирование обычно является причиной проблем в мире. – fedorqui

+0

Я просто запустил ваш пример, и я получаю ожидаемый результат. Попробуйте запустить с bash -x и посмотреть, для чего установлен $ X. Я подозреваю, что X - это не то, что вы думаете. – Bitdiot

ответ

0

у вас есть возврат каретки (CR) символ в конце вашего X= объявления переменного:

#!/bin/bash 

X=/software/xxx^M 
echo variable X = $X 
echo path using variable: $X/yyy 

(где ^M представляет собой один сп cial character - CR). Я предполагаю, что ваш редактор не показывает его. Попробуйте открыть свой скрипт с помощью vim. Windows и Linux маркируют новую строку по-другому (check wiki). Я полагаю, вы используете какой-то редактор Windows.

Bash Pitfalls webpage. Я уверен, что вы сможете многому научиться там.

кстати. один способ войти в ^Mvim: перейти вставить-режим i, чем пресса: CTRL+k, M, ENTER

+0

Вы также можете удалить все символы '^ M' из файла с помощью' vim': ':% s/^ M $ //'. Vim может быть болезненным для новичков, но «vimtutor» заставит вас полюбить его. – pawel7318

+0

Большое спасибо за ответы. В файле действительно были лишние символы. (Я подготовил его в Windows с помощью emacs - мне не нравится vi в качестве редактора). bash -x выявил ситуацию. Восстановили файл с нуля на Linux, и он работал отлично. – cliveb

Смежные вопросы