linux shell将变量参数附加到命令

Bil*_*oon 15 linux bash shell jsdoc

我试图获得一个bash脚本,为这样的给定参数生成JSDoc

./jsdoc.sh file.js another.js maybe-a-third.js
Run Code Online (Sandbox Code Playgroud)

我不知道如何将未知数量的参数传递给下一个shell命令.

(另外,不知道如何检查param是否存在,只有在没有出口的情况下if [ -z ... ])

此代码最多可用于两个参数,但显然不是正确的方法...

#!/bin/bash

# would like to know how to do positive check
if [ -z "$1" ]
then echo no param
else
        d=$PWD
        cd ~/projects/jsdoc-toolkit/

        # this bit is obviously not the right approach
        if [ -z "$2" ]
        then java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ $d/$1
        else java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ $d/$1 $d/$2
        fi

        cp -R out/jsdoc $d
fi
Run Code Online (Sandbox Code Playgroud)

任何其他指示我如何能够实现这一点将不胜感激.

编辑:根据@skjaidev的回答更新脚本 - 快乐的日子;)

#!/bin/bash

d=$PWD

for i in $*; do
    params=" $params $d/$i"
done

if [ -n "$1" ]; then
        cd ~/projects/jsdoc-toolkit/
        java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ $params
        cp -R out/jsdoc $d
fi
Run Code Online (Sandbox Code Playgroud)

gle*_*man 15

要处理包含空格的参数,请使用"$@"迭代,并将其存储以供以后在数组中使用.

#!/bin/bash
if (( $# == 0 )); then
  echo "usage: $0 file ..."
  exit
fi
dir=$(pwd)
declare -a params
for file in "$@"; do params+=( "$dir/$file" ); done
cd ~/projects/jsdoc-toolkit/
java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ "${params[@]}"
cp -R out/jsdoc "$dir"
Run Code Online (Sandbox Code Playgroud)


jma*_*man 12

$*包含所有参数.你可以迭代它们

for i in $*;
do
    params=" $params $d/$i"
done
your_cmd $params
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,总是使用`"$ @"`而不是`$*` - 前者将保留包含空格的参数,后者将受到shell字拆分的约束. (12认同)
  • 即使`"$ @"`将在其扩展中保留空格,随后扩展`$ i`将撤消效果,当`$ params`在最后一行扩展时,具有嵌入空格的文件名仍将导致多个参数哪一个是预期的.特定于Bash的解决方案是使用@glennjackman提出的数组 (2认同)