红联Linux门户
Linux帮助

谁能给讲讲bash里shift的用法,懵了。

发布时间:2011-09-18 14:46:48来源:红联作者:crossbitter
[i=s] 本帖最后由 crossbitter 于 2011-9-18 14:50 编辑 [/i]

shift语句
bash和tcsh都支持shift命令.shift将存放在位置变量中的命令行参数,依次向左传递.例如位置变量当前值
为:
$1=file1 $2=file2 $3=file3
执行一次shift命令后,位置变量的值为:
$1=file2 $2=file3

//到这还能看懂, 就是右边2的值传递给1,3的值传递给2.这个好像跟C不
一样,按照C的规则,应该是1,2的值都是file3了。


还可以在shift命令中指定位置变量转移的次数, 如:
shift n
例子:
while [ "$1"]
do
if [ "$1"="-i"] then
infile=" $2"

//写在这是指定哪个位置的变量转移两次。
shift 2
else if [ "$1"="-o"] then
outfile="$2"

//这条语句的下边哪还有变量。。。难道是循环?这个2,到底什么意思
shift 2
else
echo "Program $0 does not recognize option $1"
fi
done
tr a-z A-Z<$infile>$outfile
文章评论

共有 8 条评论

  1. orlandozx 于 2011-09-19 13:52:44发表:

    {:3_117:}顶起来~

  2. gwssgc 于 2011-09-19 10:17:05发表:

    [i=s] 本帖最后由 gwssgc 于 2011-9-19 11:08 编辑 [/i]

    引用:
    :0wszxc问题解决了,注意各种符号之间的空格 就OK了。谢版主
    crossbitter 发表于 2011-9-18 17:30

    同感!小马虎害死人啊!

    个人感觉 shiftX
    就是舍弃X个参数,shift 2 就是舍弃前面2个参数。不过实在是不知道这个shift 会用在哪里。

  3. crossbitter 于 2011-09-18 17:30:08发表:

    [i=s] 本帖最后由 crossbitter 于 2011-9-18 19:49 编辑 [/i]

    :0wszxc问题解决了,注意各种符号之间的空格 就OK了。谢版主

  4. crossbitter 于 2011-09-18 17:10:13发表:

    [i=s] 本帖最后由 crossbitter 于 2011-9-18 17:21 编辑 [/i]

    悲剧啊,直接复制就能运行。。
    shift.sh: line 3: until[ -z 1]: command not found
    shift.sh: line 4: syntax error near unexpected token `do'
    shift.sh: line 4: `do'

  5. crossbitter 于 2011-09-18 16:57:47发表:

    [i=s] 本帖最后由 crossbitter 于 2011-9-18 17:01 编辑 [/i]

    引用:
    shift 2就是把命令中的左边两个参数删除了。比如原来是
    sh shift.sh a b c d e f g
    当运行完shift 2 后,等于变成了
    sh shift.sh c d e f g
    再运行一次shift 2,就变成了
    sh shift.sh e f g
    ……
    不是把某一 ...
    相思爱文 发表于 2011-9-18 15:56


    大体的意思我明白了,但是上边的第一个程序一直是这种模样。 第二个程序很不错啊,一目了然
    shift.sh: line 3: [-z: command not found

    shift.sh: line 3: [-z: command not found

    shift.sh: line 3: [-z: command not found

    shift.sh: line 3: [-z: command not found
    程序是这样的吧。。直接从虚拟机复制出来的
    #!/bin/bash

    until [-z "$1"]
    do
    echo "$@"
    shift
    done

  6. 相思爱文 于 2011-09-18 15:56:23发表:

    [i=s] 本帖最后由 相思爱文 于 2011-9-18 16:16 编辑 [/i]

    shift 2就是把命令中的左边两个参数删除了。比如原来是
    sh shift.sh a b c d e f g
    当运行完shift 2 后,等于变成了
    sh shift.sh c d e f g
    再运行一次shift 2,就变成了
    sh shift.sh e f g
    ……
    不是把某一个变量改变了,是整体左移。


    用下面的脚本看着明显些
    #!/bin/bash
    until [ -z "$1" ]
    do
    echo '$@'= "$@ "
    echo '$1=' $1
    echo '$2=' $2
    echo '$3=' $3
    echo '$4=' $4
    echo '$5=' $5
    shift 1
    echo shift
    done
    如果保存成shift.sh,就运行sh shift.sh 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j

  7. 相思爱文 于 2011-09-18 15:49:17发表:

    [i=s] 本帖最后由 相思爱文 于 2011-9-18 16:05 编辑 [/i]

    试下这个脚本
    #!/bin/bash
    until [ -z "$1" ]
    do
    echo "$@ "
    shift 2
    done

    把脚本命名为shift.sh
    运行sh shift.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    再把脚本中的shift 2 改成别的数字再试试,看结果

    shift是移动位置,不要理解成传递值。相当于把左面的1个或多个参数给去掉了。
    shift可以用来向左移动位置参数。
    Shell的名字 $0
    第一个参数 $1
    第二个参数 $2
    第n个参数 $n
    所有参数 $@ 或 $*
    参数个数 $#
    shift默认是shift 1

  8. crossbitter 于 2011-09-18 15:14:08发表:

    0:w(5(不能沉