2016-09-22 83 views
1

我正在爲字符串的快速base64編碼創建一種別名。對於它,我已經創建了下面的函數,並把它添加到我的.bash_profile文件:bash函數 - 忽略變量值

# 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中的字符串,而不是一個值。

你能查看我在這裏錯過了什麼嗎? 在此先感謝!

回答

0

您正在使用錯誤的引號。如果你使用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 
+0

非常感謝,它做到了。將注意這些調試技巧。 –

+0

請注意,這不是強大的編程:如果字符串包含單引號(並且更危險的是,它受制於任意代碼執行),它將會失敗。 –

0

你錯過了單引號禁止擴展的事實。

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

我曾嘗試應用這些變化。在運行新的〜/ .bash_profile後,它仍然不幸解析「$ 1」: $。 〜/ .bash_profile 所有更改已成功應用 $ b64「test_val」 JDE = –

+0

您的代碼現在是什麼樣子? –

+0

像這樣: 函數b64(){ perl -MMIME :: Base64 -e'print encode_base64(「'」$ 1「'」);' } –

1

除此之外防止$1擴張明顯的報價問題,你不應該在你的程序中注入像這樣的數據:你應該將數據視爲數據!

現在,我沒有Perl的專家,但下面應該是更強大的:

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

這比我的快速修復好得多,並且值得成爲公認的答案。 –