我正在尝试获取一个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
答案 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}})都是有意义的,不太可能出现在有效的文件名中。