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

时间:2011-08-05 21:32:37

标签: linux bash shell jsdoc

我正在尝试获取一个bash脚本,为这样的给定参数生成JSDoc

./jsdoc.sh file.js another.js maybe-a-third.js

我对如何将未知数量的参数传递给下一个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

任何其他指示我如何实现这一目标将不胜感激。

编辑:根据@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

4 个答案:

答案 0 :(得分: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"

答案 1 :(得分:12)

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

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

答案 2 :(得分:3)

-n-z的反转,"$@"是将所有参数传递给子命令的规范方法。可以通过man bash找到此内容以及更多内容。

答案 3 :(得分:0)

通过谨慎使用IFS变量和特殊$@参数,可以避免使用特定于Bash的功能(在这种情况下为数组)。

#!/bin/sh

dir=$(pwd)

NEW_ARGV=""
# carefully modify original arguments individually and separate them with newlines
# in a new variable (in case they contain spaces)
NEW_ARGV=""
for var in "${@}"
do
    NEW_ARGV="${NEW_ARGV}
${dir}/${var}"
done

SV_IFS=${IFS}
# temporarily set IFS to a newline as per NEW_ARGV setup
IFS="
"
# reset $@ with the modified newline-separated arguments
set -- ${NEW_ARGV}
IFS=${SV_IFS}

# for testing, demonstrate each param is preserved
c=0
for i in "${@}"
do
    c=`expr ${c} + 1`
    echo "args-via-var #${c}: \"${i}\""
done

cd ~/projects/jsdoc-toolkit/
java -jar jsrun.jar app/run.js -a -t=templates/jsdoc/ "${@}"
cp -R out/jsdoc "${dir}"

没有必要重置$@,但这样做可以避免在多个地方弄乱IFS。如果不经过$@,则必须在IFS处设置$NEW_ARGV扩展NUL

那些关注细节的人会注意到这种方法在包含换行符时不会保留参数。除了当然ctrl-\之外,可以使用任何控制字符代替换行符,也许ASCII FS(文件分隔符,又名{{1}})都是有意义的,不太可能出现在有效的文件名中。