Хобрук: Ваш путь к мастерству в программировании

функция bash - значение переменной игнорируется

Я создаю своего рода псевдоним для быстрой кодировки строк base64. Для этого я создал следующую функцию и добавил ее в свой файл .bash_profile:

# My functions
function b64() {
    perl -MMIME::Base64 -e 'print encode_base64("$1");'
}

Проблема в том, что он кодирует саму строку "$1" без обработки фактического значения, которое я "даю" ему в запросе:

$ b64 "test_value"
JDE=

$ echo -n "JDE=" | base64 -d
$1

Я пытался использовать «$1» и «$1» без кавычек, но проблема остается, и она продолжает кодировать $1 как строку, а не значение.

Не могли бы вы проверить, что мне здесь не хватает? Заранее спасибо!

22.09.2016

Ответы:


1

Вы используете неправильные цитаты. Вы можете легче отладить это, если вы используете echo, чтобы показать, что вы выполняете:

$ b64() { echo 'print encode_base64("$1");'; }
$ b64 foo
print encode_base64("$1");
$ b64() { echo "print encode_base64('$1');"; }
$ b64 foo
print encode_base64('foo');

Существуют и другие методы отладки, например printf '%q\n' или set -x.


Обладая этими знаниями, вы можете написать свой b64 как

b64() { perl -MMIME::Base64 -e "print encode_base64('$1');"; }

Это дает мне ожидаемый результат:

$ b64 foo
Zm9v
$ base64 -d <<<Zm9v
foo
22.09.2016
  • Большое спасибо, это помогло. Обратите внимание на эти советы по отладке. 22.09.2016
  • Имейте в виду, что это ненадежное программирование: оно потерпит неудачу, если строка содержит одинарные кавычки (и, что более опасно, она может быть выполнена произвольным образом). 22.09.2016

  • 2

    Помимо очевидной проблемы с кавычками, препятствующей расширению $1, вы не должны вводить данные в свою программу таким образом: вы должны обращаться с данными как с данными!

    Теперь я не эксперт Perl, но следующее должно быть более надежным:

    b64() {
        perl -MMIME::Base64 -e 'print encode_base64($ARGV[0]);' -- "$1"
    }
    
    22.09.2016
  • Это намного лучше, чем мое быстрое решение, и заслуживает того, чтобы стать общепринятым ответом. 23.09.2016

  • 3

    Вы упускаете тот факт, что одинарные кавычки препятствуют расширению.

    perl -MMIME::Base64 -e 'print encode_base64("'"$1"'");'
    
    22.09.2016
  • Я попытался применить эти изменения. После запуска нового ~/.bash_profile он, к сожалению, по-прежнему анализирует сам $1: $ . ~/.bash_profile Все изменения успешно применены $ b64 test_val JDE= 22.09.2016
  • Как сейчас выглядит ваш код? 22.09.2016
  • Вот так: function b64() { perl -MMIME::Base64 -e 'print encode_base64('$1');' } 22.09.2016
  • И вы уверены, что это та функция, которую поддерживает ваша оболочка? 22.09.2016
  • @TobySpeight: это действительно похоже на мое; Мне пришлось скопировать и вставить его, так как форматирование не применялось, но оно совпадает. 22.09.2016
  • На самом деле в этом профиле нет других функций, и до того, как я его добавил, не было исполняемого файла b64. b64 отображается в списке, когда я пытаюсь использовать доступные команды TAB: '$ b b64 bonobo-activation-run-query base64' ... и так далее. Я думал, что он не добавлен должным образом, но все, кажется, показывает, что это сделано и решено правильно, за исключением проблемы с переменной. 22.09.2016
  • А set показывает обновленную функцию? 22.09.2016
  • Только что проверил, да, набор показывает тот же код, что и в файле .bash_profile: b64 () { perl -MMIME::Base64 -e 'print encode_base64('$1');' } Извините, что не форматировал, все еще пытаюсь разобраться в комментариях. 22.09.2016
  • Имейте в виду, что это ненадежное программирование: оно потерпит неудачу, если строка содержит двойные кавычки (и, что более опасно, она может быть выполнена в произвольном порядке). 22.09.2016
  • Новые материалы

    Краткое руководство для начинающих по простому сквозному тестированию с помощью Cypress
    Автоматизированное тестирование, требующее только базовых навыков JavaScript. Цель этой статьи - показать, как с минимальными усилиями вы можете добавить полезные сквозные (E2E) тесты в свой..

    Руководство по быстрой разработке рекомендательной системы промышленного уровня
    В этой статье я намерен предоставить краткий обзор методов, которые можно использовать для разработки хорошо работающей рекомендательной системы. Я начал работать над Recommender Systems около 6..

    Arshaw FullCalendar для AngularJS — проблемы, с которыми столкнулись, и найденные решения для их устранения
    Arshaw FullCalendar — это полноразмерный календарь событий с возможностью перетаскивания, использующий jQuery. Подробнее об этом можно узнать здесь . Директива ui-calendar — это полная..

    Простое руководство по Redux для разработчиков React
    Понимание строительных блоков Redux Redux — это инструмент управления состоянием, который чаще всего используется с React или React Native. Когда я впервые начал использовать его год назад,..

    присоединение к атрисмаркетингу
    присоединение к атрисмаркетингу И много дополнительных привилегий. маркетинг — реклама-хорошие отзывы клиентов-доверие-счастье-лояльность и опытные сотрудники устойчивые лесозаготовительные..

    КОВАРИАНТНОСТЬ И КОРРЕЛЯЦИЯ
    ВВЕДЕНИЕ В этом посте мы обсудим ковариацию и корреляцию. Это играет важную роль при выборе функций. Статистические корреляции говорят нам как о силе связи между двумя переменными, так..

    Использование матриц Вигнера в случаях машинного обучения, часть 8
    Равномерный локальный закон для матриц Вигнера (arXiv) Автор: Джорджо Чиполлони , Ласло Эрдеш , Доминик Шредер . Аннотация: Мы доказываем общий локальный закон для матриц Вигнера, который..