如何将TCL脚本中的变量赋值给Bash脚本的变量
问题原因
你当前的赋值写法不符合Bash捕获命令输出的语法规则:
你写的file_status='source example.tcl; foreach _v {file_status } {puts "\"[set $_v]\""}' | tclsh实际执行逻辑是:将字符串赋值给file_status变量,再把该赋值操作的空输出通过管道传递给tclsh,全程没有捕获tclsh运行后的实际输出内容,所以最后变量的值是空的。
解决方法
使用Bash的命令替换语法($())包裹需要执行的TCL调用逻辑,即可将tclsh的标准输出捕获后赋值给Bash自定义变量,正确代码如下:
# 捕获tclsh输出赋值给变量 file_status=$(echo 'source example.tcl; foreach _v {file_status } {puts [set $_v]}' | tclsh) # 验证输出 echo $file_status
如果需要保留TCL输出中的引号、空格等特殊字符,给命令替换和变量引用外层加双引号即可:
file_status="$(echo 'source example.tcl; foreach _v {file_status } {puts "\"[set $_v]\""}' | tclsh)" echo "$file_status"
批量传递变量优化方案
如果需要一次性将多个TCL变量导入到Bash环境,可以直接生成Bash赋值语句并加载到当前shell,操作更高效:
# 示例同时导入file_status、version、data_path三个TCL变量 source <(echo 'source example.tcl; foreach _v {file_status version data_path} {puts "$_v=\"[set $_v]\""}' | tclsh) # 加载完成后可直接使用变量 echo $file_status echo $version echo $data_path
内容的提问来源于stack exchange,提问作者Tim Scott
相关产品推荐
相关产品推荐

