LINUX.ORG.RU
ФорумAdmin

ruby from command-line — не получается передать переменную из bash

 ,


0

1

Здравствуйте!

Что-то я совсем туплю:

a = 42
b = ( a / 8 ) * 8
puts b.to_s
40
Естественно — работает. Надо:
a=42 
b=$(echo ${a} | ruby -e 'А вот что здесь надо написать, убей бог — не понимаю!')
Например так извращался:
a=42; b=$(echo ${a} | ruby -ep 'c = ( #{a} / 8 ); puts c.to_s')
Конечно не работает.

Помогите скорбному умом, ПОЖАЛУЙСТА!



Последнее исправление: Cave-Canem (всего исправлений: 2)

Ответ на: комментарий от shell-script

shell-script, Не работает:

export a=42
ruby -ep "puts ENV['a']"

ruby -ep 'puts ENV['a']'

ruby -ep 'puts ENV[a]'

И вообще, хотелось бы без глобальных переменных...

Cave-Canem
() автор топика
Ответ на: комментарий от etwrq

etwrq

Вот так работает:

echo 42 |  ruby -e 'c = gets.chomp; d =8 * ( c.to_i / 8 ); puts d.to_s'
40
Но уж больно криво как-то...

Cave-Canem
() автор топика
Ответ на: shell-script, Не работает: от Cave-Canem

Делай так:

$ ruby -e 'puts ARGV' foo bar baz

По поводу твоих попыток: $ ruby -ep "puts ENV['a']" интерпретируется как $ ruby -e p "puts ENV['a']", разобраться в том, почему оно выводит тот результат, который оно выводит (а именно ничего), я предоставляю читателю. ХИНТ: посмотреть в доках, что делает метод p.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Собственно, твой исходный пример:

$ b=42; ruby -e 'puts (ARGV[0].to_i / 8) * 8' $b
40

И почитай, пожалуйста, хоть какую-нибудь книжку или доку по языкам, которые ты используешь, а то пишешь какую-то чушь.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от Ja-Ja-Hey-Ho

Ja-Ja-Hey-Ho:

Да, так работает:

echo 42 | ruby -e 'puts STDIN.gets.to_i / 8 * 8'
40
Но неужели нельзя изящнее?

Cave-Canem
() автор топика
Ответ на: комментарий от theNamelessOne

theNamelessOne,

Спасибо, это наверное лучший вариант.

Про ARGV конечно знал, но как-то не пришло в голову, что его можно использовать в командной строке...

Я же писал — умом скорбен...

Cave-Canem
() автор топика

Передавай через ARGV, либо подключи гем Trollop и передавай через опции, например ./script.rb --foo=bar. Ну или используй ENV, только разберись с опциями (зачем тебе опция -p?).

spijet ★★★
()

Существует волшебная переменная $_, в которую (при использовании флага -n) попадает текущая строка из stdin.

Заюзать $_ можно так:

a=42
echo $a | ruby -ne 'a = $_.to_i; b = (a / 8) * 8; puts b'

evbogdanov
()
Ответ на: комментарий от evbogdanov

Полное решение, думаю, очевидно. Но на всякий случай:

a=42
b=$(echo $a | ruby -ne 'a = $_.to_i; b = (a / 8) * 8; puts b')
echo $b
# 40

evbogdanov
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.