2010-10-13 2 views
16

Если у меня есть переменная, содержащая знак неускоренного доллара, можно ли каким-либо образом отбросить все содержимое переменной?Как эхо-переменная, содержащая знак неэкранированного доллара в bash

Например, что-то вызывает сценарий:

./script.sh "test1$test2"

, а затем, если я хочу использовать параметр становится "усеченный" как так:

echo ${1}
test1

, конечно, одно- цитирование имени varaible не помогает. Я не могу понять, как процитировать его, чтобы я мог, по крайней мере, избежать знака доллара, когда скрипт получает параметр.

ответ

7

Переменная заменяется до запуска сценария.

./script.sh 'test1$test2' 
+0

Да, это похоже на случай :) – Not22

+0

Есть и другие ситуации, хотя у меня на самом деле есть переменные с неоцененными знаками доллара, например, когда я читаю данные из файлов. Затем я хочу вызвать свой скрипт с этими данными, так что это мой единственный вариант, чтобы передать весь файл перед его чтением? – Not22

+1

Чтение данных из файлов не приводит к замене переменных. –

28

Проблема заключается в том, что сценарий получает «test1» в первую очередь, и он не может знать, что там была ссылка на пустой (необъявленной) переменной. Вы должны избежать $ перед передачей его в сценарий, как это:

./script.sh "test1\$test2" 

Или одиночные кавычки ' так:

./script.sh 'test1$test2' 

В этом случае удар не будет расширяться переменные из этой строки параметров ,

0

Как сказал вам Игнасио, переменная заменена, поэтому ваши сценарии получают ./script.sh test1 как значения для $0 и $1.

Но даже в случае, когда вы использовали литеральные цитаты, чтобы передать аргумент, вы всегда указываете "$1" в своем echo "${1}". Это хорошая практика.

+0

И фигурные скобки * не нужны, так как это простая подстановка. –

+0

Да, они не нужны. Использование их просто необязательно. – Benoit

4

с использованием одинарных кавычек, метасимволы, такие как $, сохраняют свое буквальное значение. Если используются двойные кавычки, имена переменных будут интерполированы.

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