在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
相关产品推荐
相关产品推荐

