我在bash中有一个函数,它接受参数,我想提取除第一个之外的所有参数。
我正在尝试这个
alias save=save
save(){
for i in "$@"; do
if [ i -gt 1 ]
then
echo $i
fi
done
}
但是它给出了错误
sh.exe":[:i:预期的整数表达式
我知道$i
是参数本身,所以这样做
if [ $i -gt 1 ]
给出错误
$ save hi hola
sh.exe":[:hi:整数表达式预期
sh.exe":[:hola:期望的整数表达式
如果$i
是参数本身,并且i
不作为变量工作,那么它还有什么用呢?
答案 0 :(得分:3)
在Bash中执行此操作的方法是"${@:2}"
,这使得多元素扩展从第二个参数开始。这样就不必使用shift
。如果需要,您仍然可以访问第一个参数。
save() {
for i in "${@:2}"; do
echo "$i"
done
}
如果您只想逐行打印参数,那么使用printf
也是一种更简单的方法:
save() {
printf '%s\n' "${@:2}"
}
答案 1 :(得分:2)
先做一个转变摆脱第一个arg。这样你就不需要循环体中的条件,你也可以将for i in "$@"
简化为for i;
,如下所示:
save() {
shift
for i; do
echo $i
done
}
答案 2 :(得分:0)
不幸的是,无法使用带有参数数组$@
或$*
的索引,您将获得错误的替换错误
但你可以将它分配给另一个数组,并像这样使用索引
declare -a ARRAY=("$@")
for ((i=1; i< ${#ARRAY[@]};i++ )) ; do
echo "${ARRAY[$i]}"
done
请注意,您的索引位于$i