На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
boogie
Сообщения: 21
ОС: Archlinux
Сообщение
boogie » 24.10.2007 20:36
Господа, столкнулся со следующей проблемой:
допустим, есть вот такое:
И мы ему скармливаем в качестве аргумента "$1$MfWXWN.X$LqNJQSvdBk9y5GS5rslUk0". А на выходе получаем:
Код: Выделить всё
boogie@armory:~$ ./_pwadd $1$MfWXWN.X$LqNJQSvdBk9y5GS5rslUk0
.X
Понятно, что знаки "$" в аргументе сбивают интерпретатор с толку, и он пытается показать их как переменные. Вопрос - как заставить sh передавать жесткое значение аргумента? Кавычки и printf изучены, пробовались, толку - ноль. При этом аргумент должен передаваться без кавычек - это жесткое условие.
"We all know Linux is great…it does infinite loops in 5 seconds." © Linus Torvalds
Liksys
Сообщения: 2910
Сообщение
Liksys » 24.10.2007 20:46
Если только экранировать бекслешем, но лучше использовать одинарные кавычки
boogie
Сообщения: 21
ОС: Archlinux
Сообщение
boogie » 24.10.2007 20:49
Liksys , в том-то и дело, что одно из условий - аргумент должен передаваться в оригинальном виде.
"We all know Linux is great…it does infinite loops in 5 seconds." © Linus Torvalds
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:
Сообщение
diesel » 24.10.2007 20:52
boogie_byte писал(а): ↑ 24.10.2007 20:36
При этом аргумент должен передаваться без кавычек - это жесткое условие.
это как раз неправильное условие. поскольку замена происходит не внутри скрипта, а при передаче аргумента:
Код: Выделить всё
diesel@beezir:~$ cat test.sh
#!/bin/bash
echo $1
diesel@beezir:~$ bash test.sh '$1$MfWXWN.X$LqNJQSvdBk9y5GS5rslUk0'
$1$MfWXWN.X$LqNJQSvdBk9y5GS5rslUk0
diesel@beezir:~$ bash test.sh $1$MfWXWN.X$LqNJQSvdBk9y5GS5rslUk0
.X
Или вот так:
diesel@beezir:~$ ./test.sh \$1\$MfWXWN.X\$LqNJQSvdBk9y5GS5rslUk0
$1$MfWXWN.X$LqNJQSvdBk9y5GS5rslUk0
boogie
Сообщения: 21
ОС: Archlinux
Сообщение
boogie » 24.10.2007 20:54
Я знаю, что эта задача не имеет решения, я хочу понять как ее решать!
Понятно, что шелл ошибается при еще при передаче аргумента, но неужели с такой проблемой никто не сталкивался и не было найдено решения?
"We all know Linux is great…it does infinite loops in 5 seconds." © Linus Torvalds
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian
Контактная информация:
Сообщение
diesel » 24.10.2007 20:55
boogie_byte писал(а): ↑ 24.10.2007 20:49
Liksys , в том-то и дело, что одно из условий - аргумент должен передаваться в оригинальном виде.
поставь его в кавычки перед передачей. или найди шелл который не интерпретирует знак доллара.
boogie_byte писал(а): ↑ 24.10.2007 20:54
Я знаю, что эта задача не имеет решения, я хочу понять как ее решать!
полные условия задачи давай. обходные решения найти можно. "в лоб" - нельзя
boogie
Сообщения: 21
ОС: Archlinux
Сообщение
boogie » 24.10.2007 21:03
В общем, и целом, буду забирать значение через read, видимо... Такая реализация тоже возможна, просто не так удобна. Ладно, все равно спасибо! Хоть буду точно уверен в том, что это не мой косяк
"We all know Linux is great…it does infinite loops in 5 seconds." © Linus Torvalds
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU
Контактная информация:
Сообщение
sash-kan » 26.10.2007 19:45
boogie_byte писал(а): ↑ 24.10.2007 20:54
Понятно, что шелл ошибается
спасибо, посмеялся (:
любой шелл — это вообще глючная вещь. нафига всякие там переменные придумали? вот без переменных было бы классно!
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5
Сообщение
sergio » 27.10.2007 01:51
sash-kan писал(а): ↑ 26.10.2007 19:45
любой шелл — это вообще глючная вещь.
Кстати, хорошо сказано.
Дюжина разных скобок и кавычек с дюжиной разных "зарезервированных" символов и подстановок, хуча невидимых автоматических переменных, пяток разных, но оч похожих при этом форматов регекспов в разных программах и с разными ключами, даже ницасная звездочка, которая у одних прог включает скрытые файлы, у других не включает, у третьих в манах написано, что с такой-то версии поведение изменилось для совместимости с неведомо-чем.
Тут есть с чего новичку начать искать глюки.
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome