我正在尝试创建一个与ls命令的前12个参数相呼应的脚本。我们应该使用“移位”语法构建到shell中,但我很难理解shift命令是如何工作的(是的,我查了一下,尝试了,并且无法弄明白)。如果有人能指出我如何使用shift命令来实现这个目标的正确方向,那将非常感激。我发布了迄今为止我所尝试的内容(公平警告,它无休止地循环,如果你试图自己运行它)
#!/bin/sh
args=a A b c C d e E f F g h H
while [ $# -lt 12 ]
do
echo ls -$#
count=`expr $# + 1`
shift
done
答案 0 :(得分:0)
你可以这样做:
#!/bin/sh
set -- a A b c C d e E f F g h H # set argument list to have 12 values
i=0
while ((i < 12)); do # loop until we scan 12 arguments
ls -- "$1" # do ls with the current argument
((i++))
shift # shift left so that $2 becomes $1 and so on
if (($# == 0)); then break; fi # break if no more arguments
done
答案 1 :(得分:0)
处理所有POSIX shell移位的一种可靠方法是使用算术比较$#
在while循环中使用(( $# ))
,例如
#!/bin/sh
while (( $# )); do
echo "$1"
shift
done
示例使用/输出
$ sh shiftargs.sh a A b c C d e E f F g h H
a
A
b
c
C
d
e
E
f
F
g
h
H
答案 2 :(得分:0)
shift
删除arguments数组的第一个元素。如果脚本使用12个或更多参数运行,则跳过循环。如果使用少于12个参数运行(如在您的示例中),则将打印每个参数,然后将其移开。 while循环条件无限正确,因为数组长度总是小于12。
#!/bin/sh
count=0
while [ $# -gt 0 ] && [ $count -lt 12 ]
do
echo ls -$1
shift
(( count++ ))
done
请参阅shift reference。