You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Bash中捕获npm命令输出并修正if条件语法问题

NPM包发布脚本的问题与解决

1. 是否可以将npm view命令的输出赋值给变量?

完全可以,你使用checkRegistry=$(npm view $package)的写法是有效的,但要注意一个细节:npm view在包不存在时,错误信息会输出到标准错误流(stderr),而非标准输出(stdout),所以直接用$()只会捕获stdout的内容,错误信息会直接打印到终端,同时变量会是空值。如果需要同时捕获stdout和stderr,可以修改为:

checkRegistry=$(npm view "$package" 2>&1)

2. 上述if语句的语法存在哪些错误?

你的if语句存在多处语法问题,具体如下:

  • 错误嵌套[[:Bash中条件判断无需嵌套[[,应使用单个[[ ]]或[ ]包裹所有条件(推荐用[[ ]],支持更灵活的逻辑运算)。
  • 逻辑或写法错误:你将||放在两个独立的[[]]之间,不符合Bash语法,所有逻辑条件应放在同一个[[ ]]内部。
  • 字符串比较缺少空格:$checkRegistry==""中比较运算符==两边必须有空格,正确写法是$checkRegistry == ""。
  • grep缺少输入源:grep -q "npm ERR!"没有指定要搜索的内容,应针对checkRegistry变量的内容进行匹配,比如使用正则匹配$checkRegistry =~ "npm ERR!",或者通过管道传递变量内容。

修正后的完整代码示例

package="@react-framework/deploy@1.2.3.0"
# 捕获npm view的所有输出(包括错误信息)
checkRegistry=$(npm view "$package" 2>&1)
# 判断包不存在的两种情况:包含错误提示,或输出为空
if [[ $checkRegistry =~ "npm ERR!" || $checkRegistry == "" ]]; then
    npm publish "$package"
fi

内容的提问来源于stack exchange,提问作者jizzer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:15:50