Bash中多行管道命令赋值变量失败,求助解决方法
Bash脚本JSESSIONID变量赋值与输出错误解决方法
编写了如下Bash脚本(省略部分隐私内容):
JSESSIONID=$(curl -I 'http://17....212' \ -H 'Accept: text/h...b3;q=0.7' \ -H 'Accept-Language: zh...8' \ -H 'Cache-Control: ma...0' \ -H 'Connection: k...ve' \ -H 'Upgrade-Insecure-Requests: 1' \ -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' \ --insecure|grep -o -e "JSESSIONID=\(.*\); P"|sed "s/JSESSIONID=//g"|sed "s/; P//g") echo $(JSESSIONID)需求是提取JSESSIONID,管道命令单独在命令行执行能返回纯净的JSESSIONID字符串,但脚本运行时出现错误:
/etc/rc.common: line 37: JSESSIONID: not found,尝试将$()改为反引号也无效,需要正确的变量赋值与输出方法。
错误原因
报错根源在最后一行的echo $(JSESSIONID):$(...)是命令替换语法,会把JSESSIONID当作系统命令去执行,而非引用已定义的变量,自然会提示"命令未找到"。
修正后的脚本
JSESSIONID=$(curl -I 'http://17....212' \ -H 'Accept: text/h...b3;q=0.7' \ -H 'Accept-Language: zh...8' \ -H 'Cache-Control: ma...0' \ -H 'Connection: k...ve' \ -H 'Upgrade-Insecure-Requests: 1' \ -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' \ --insecure | grep -o -e "JSESSIONID=\(.*\); P" | sed "s/JSESSIONID=//g" | sed "s/; P//g") # 正确引用变量的方式 echo "$JSESSIONID"
额外优化建议
- 引用变量时加双引号
"$JSESSIONID",可避免变量值含空格或特殊字符时出现异常 - 合并sed命令减少管道步骤:将两个sed命令改为
sed -e 's/JSESSIONID=//' -e 's/; P//'
内容的提问来源于stack exchange,提问作者MacMillan
相关产品推荐
相关产品推荐

