首页 > 解决方案 > 在 shell 脚本中,如何正确转义双引号,以便可以使用带引号的参数运行命令?

问题描述

我想在我的 shell 脚本中运行这样的东西:

./node_modules/.bin/npm-run-all -p "ng lint myapp"

我有一个 for 循环来生成带引号的字符串:

LINT=""
for app in $APPS
do
    LINT="$LINT \"ng lint ${app}\""
done

我认为使用 \" 将能够生成我想要的字符串。但是当我运行时:

./node_modules/.bin/npm-run-all -p ${LINT}

我得到:

ERROR: Task not found: ""ng", myapp""

似乎正在运行:

./node_modules/.bin/npm-run-all -p \"ng lint myapp\"

什么是转义双引号以便我运行它的正确方法?:

./node_modules/.bin/npm-run-all -p "ng lint myapp"

标签: bashshell

解决方案


更新:感谢您指出另一个重复的问题和@CharlesDuffy 的评论。我的问题可以这样解决:

#!/bin/bash

APPS="app1 app2"
LIBS="lib1 lib2"
PROJECTS="${APPS} ${LIBS}"

projects=()
for project in $PROJECTS
do
  projects+=("ng lint ${project}")
done

./node_modules/.bin/npm-run-all -p "${projects[@]}"

WAIT的另一种方法:

#!/bin/bash

APPS="app1 app2"
LIBS="lib1 lib2"
PROJECTS="${APPS} ${LIBS}"

FAIL=0

pids=()

for project in $PROJECTS
do
  ng lint "${project}" & pids+=( "$!" )
done

for pid in "${pids[@]}"
do
  wait "${pid}" || FAIL=$(( FAIL + 1 ));
done

if [ "$FAIL" != "0" ];
  then
    exit 1
fi

推荐阅读