在Sh Shell中将命令输出存入数组的问题求助
解决Sh Shell中命令输出存入数组的问题
你的脚本出现问题的核心是Sh(POSIX shell)的数组语法和Bash有差异,以及变量引用的写法错误。我来帮你一步步解决:
问题根源
你写的start_time=$cmd[0]在Sh中会被解析为:先展开变量$cmd(在支持数组的Sh实现里,$cmd默认会输出数组的所有元素),然后拼接字符串[0],这就是为什么你得到1572443382 1572443386[0]的原因。
另外,虽然部分Sh实现(比如dash)支持数组,但必须用正确的语法引用元素。
解决方案
根据你的需求,有两种可靠的方法:
方法1:使用Sh兼容的数组语法(适用于支持数组的Sh)
只需修正变量引用的写法,用${数组名[索引]}的格式来访问数组元素:
#!/bin/sh cmd=($(date +%s;sleep 5; date +%s)) start_time=${cmd[0]} # 用大括号包裹数组引用 end_time=${cmd[1]} echo $start_time
方法2:纯POSIX兼容写法(适用于所有Sh环境)
如果你的Sh完全不支持数组(严格POSIX标准),可以用位置参数来存储多个值,这是最通用的方式:
#!/bin/sh # 用set --将命令输出的分词设置为位置参数$1、$2... set -- $(date +%s;sleep 5; date +%s) start_time=$1 end_time=$2 echo $start_time
或者用换行分隔存储,再通过head/tail提取:
#!/bin/sh # 先保存命令的完整输出 output=$(date +%s;sleep 5; date +%s) # 提取第一行作为开始时间 start_time=$(echo "$output" | head -n1) # 提取最后一行作为结束时间 end_time=$(echo "$output" | tail -n1) echo $start_time
这两种方法都能让你正确获取到开始时间,完全符合Sh的语法规范。
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

