Unix环境下变量创建赋值与URL编码问题求助
1. 正确的Bash变量赋值方式
你遇到的bash: test: =: unary operator expected错误,核心原因是变量赋值时等号两边绝对不能加空格。Bash对语法格式要求很严格,空格会让它把test当成独立命令,=当成命令参数,自然就抛出了语法错误。
正确的写法应该是这样:
test="example"
如果变量值里没有空格、特殊字符(比如$、*这类),也可以省略引号:
test=example
补充个小细节:如果变量值包含空格或需要解析内部变量,用双引号;如果要原样保留内容(比如不想让$USER被解析成用户名),就用单引号:
# 解析内部变量 greeting="Hi, $USER!" # 原样保留字符 greeting='Hi, $USER!'
2. Unix下实现URL编码的解决方案
urlencode不是Unix系统默认自带的命令,所以会提示command not found。这里给你几个实用的替代方案:
方案一:用Python(推荐,大部分系统默认预装)
一行命令就能搞定,分Python3和Python2版本:
# Python3版本 echo -n "gdh@" | python3 -c "import urllib.parse; print(urllib.parse.quote(input()))" # Python2版本(如果你的系统还在用的话) echo -n "gdh@" | python -c "import urllib; print(urllib.quote(raw_input()))"
执行后会输出gdh%40,这就是gdh@对应的URL编码结果。
方案二:用Perl
Perl也是很多Unix系统默认安装的工具,命令如下:
echo -n "gdh@" | perl -MURI::Escape -ne 'print uri_escape($_)'
方案三:自定义bash函数
如果需要频繁使用URL编码,可以把下面的函数加到你的~/.bashrc或~/.profile文件里:
urlencode() { local input="$1" python3 -c "import urllib.parse; print(urllib.parse.quote('''$input'''))" }
保存后执行source ~/.bashrc生效,之后直接运行urlencode "gdh@"就能得到编码结果,和用系统命令一样方便。
3. 执行Export时避免打印变量
首先纠正个小错误:正确的导出命令是export var="val"(等号两边不能有空格)。默认情况下,export命令本身是不会输出任何内容的——如果你看到了变量打印,大概率是脚本里加了多余的echo $var,或者开启了调试模式set -x。
如果是交互式shell里执行,直接输入export var="val"回车,变量会悄悄被导出到环境变量中,不会有任何输出;如果是在脚本里:
- 检查脚本是否有
echo $var这类输出语句,删掉即可; - 如果脚本开启了
set -x(调试模式会打印所有执行的命令),可以临时关闭调试模式再导出:
{ set +x; export secret_var="my_password"; set -x; }
这样export的过程就不会被打印出来,调试模式也能继续生效。
内容的提问来源于stack exchange,提问作者user2591169

