【问题标题】:bash function - variable value ignored [duplicate]bash函数 - 变量值被忽略[重复]
【发布时间】:2026-02-02 02:45:01
【问题描述】:

我正在为字符串的快速 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 编码为字符串而不是值。

你能检查一下我在这里遗漏了什么吗? 提前致谢!

【问题讨论】:

    标签: bash function variables


    【解决方案1】:

    除了阻止$1 扩展的明显引用问题外,您不应该在程序中注入这样的数据:您应该将数据视为数据!

    现在,我不是 Perl 专家,但以下内容应该更可靠:

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

    【讨论】:

    • 这比我的快速修复要好得多,值得成为公认的答案。
    【解决方案2】:

    您使用了错误的引号。如果您使用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
    

    【讨论】:

    • 非常感谢,它成功了。会记下这些调试提示。
    • 请注意,这不是健壮的编程:如果字符串包含单引号,它将失败(更危险的是,它会被任意代码执行)。
    【解决方案3】:

    你错过了单引号抑制扩展的事实。

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

    【讨论】:

    • 我已尝试应用这些更改。运行 new ~/.bash_profile 后,不幸的是它仍然解析 "$1" 本身: $ 。 ~/.bash_profile 所有更改均已成功应用 $ b64 "test_val" JDE=
    • 你的代码现在是什么样子的?
    • 像这样:function b64() { perl -MMIME::Base64 -e 'print encode_base64("'"$1"'");' }
    • 你确定这是你的 shell 正在使用的功能吗?
    • 请注意,这不是健壮的编程:如果字符串包含双引号,它将失败(更危险的是,它会被任意代码执行)。