代码之家  ›  专栏  ›  技术社区  ›  techguy2000

在shell脚本中,如何正确转义双引号,以便可以运行带引号的参数的命令?[复制]

  •  0
  • techguy2000  · 技术社区  · 6 年前

    ./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\u modules/.bin/npm运行所有-p“ng lint myapp”
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   techguy2000    6 年前

    更新:感谢你指出另一个重复的问题和@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[@]}"
    

    另一种等待方式:

    #!/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