Shell脚本显示“ls”命令的前12个命令行参数

时间:2018-03-21 04:01:37

标签: shell unix scripting

我正在尝试创建一个与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

3 个答案:

答案 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