二、Shell变量二之位置参数变量变量
$0: 获取当前执行的shell脚本的文件名,如果执行脚本包含了路径,那么就包含脚本的路径。 $n: 获取当前执行的shell脚本的第n个参数值,n=1..9,当n=0时表示脚本的文件名;如果n>9,则用大括号括起来,如${11} ${12},2个参数中间使用空格隔开。 $# 获取当前执行的shell脚本后面接的参数的总个数。 $* 获取当前shell脚本所有传参的参数,不加引号和$@相同;如果给$*加上双引号,如:"$*",则表示将所有的参数视为单个字符串,相当于"$1 $2 $3" $@ 获取当前shell脚本所有传参的参数,不加引号和$*相同;如果给$@加上双引号,如:"$@",则表示将所有的参数视为不同的独立字符串,相当于"$1" "$2" "$3" "..."。这是将多参数传递给其它程序的最佳方式,因为它会保留所有的内嵌的每个参数丽的任何空白。当"$@"和"$*"都加双引号时,两者是有区别的;都不加双引号时,两者无区别。
[root@node1 tmp]# cat /tmp/test.sh #! /bin/bash echo $1 [root@node1 tmp]# bash /tmp/test.sh ywx1 ywx2 ywx1 #只显示$1的值 [root@node1 tmp]# bash /tmp/test.sh "ywx1 ywx2" ywx1 ywx2 #把ywx1和ywx2用双引号括起来,则表示一个参数
[root@node1 tmp]# cat test2.sh #! /bin/bash echo $1 echo $2 [root@node1 tmp]# bash /tmp/test2.sh ywx1 ywx2 ywx3 ywx1 ywx2 #在显示$1 $2的值 [root@node1 tmp]# bash /tmp/test2.sh ywx "king seal" kaka ywx king seal #"king seal"被双引号引起作为$2
[root@node1 tmp]# cat test3.sh #! /bin/bash echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15 [root@node1 tmp]# echo {a..z} a b c d e f g h i j k l m n o p q r s t u v w x y z [root@node1 tmp]# bash /tmp/test3.sh {a..z} a b c d e f g h i a0 a1 a2 a3 a4 a5 #在$9之后显示错误了 #更改test3.sh脚本 [root@node1 tmp]# cat test3.sh #! /bin/bash echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15} [root@node1 tmp]# bash /tmp/test3.sh {a..z} a b c d e f g h i j k l m n o #加上大括号则正常
[root@node1 tmp]# cat test.sh #! /bin/bash echo $0 [root@node1 tmp]# bash /tmp/test.sh ywx1 ywx2 /tmp/test.sh #显示文件名
dirname取脚本的路径 [root@node1 tmp]# dirname /tmp/test.sh /tmp basename取脚本的名字 [root@node1 tmp]# basename /tmp/test.sh test.sh
[root@node1 tmp]# cat /tmp/test.sh #! /bin/bash echo $# [root@node1 tmp]# sh /tmp/test.sh ywx1 ywx2 ywx3 3
[root@node1 tmp]# set -- "I am" handsome ywx #<==通过set设置三个字符串参数,“——”表示清除所有的参数变量,重新设置后面的参数变量。 [root@node1 tmp]# echo $# 3 [root@node1 tmp]# echo $1 I am [root@node1 tmp]# echo $2 handsome [root@node1 tmp]# echo $3 ywx #$*和$@不加引号 [root@node1 tmp]# echo $* I am handsome ywx [root@node1 tmp]# echo $@ I am handsome ywx #$*和$@不加引号,使用for循环打印参数 [root@node1 tmp]# for i in $*;do echo $i;done I am handsome ywx [root@node1 tmp]# for i in $@;do echo $i;done I am handsome ywx #不加双引号,会输出所有的内容,第一个参数$1="I am"会被拆开 #$*和$@加引号 [root@node1 tmp]# echo "$*" I am handsome ywx [root@node1 tmp]# echo "$@" I am handsome ywx #$*和$@加引号,使用for循环打印参数 [root@node1 tmp]# for i in "$*"; do echo $i ;done I am handsome ywx #"$*" 输出的参数"$1 $2 $3..." [root@node1 tmp]# for i in "$@"; do echo $i ;done I am handsome ywx #"$@" 输出的参数是"$1" "$2" "$3" ...
[root@node1 tmp]# cat test.sh #! /bin/bash echo $1 shift 1 echo $1 shift 2 echo $1 [root@node1 tmp]# sh /tmp/test.sh ywx1 ywx2 ywx3 ywx4 ywx1 ywx2 #在ywx1 ywx2 ywx3 ywx4上向右偏移1个,跳过ywx1,偏移后的$1=ywx2 ywx4 #在ywx2 ywx3 ywx4上向右偏移2个,跳过ywx2 ywx3,偏移后的$1=ywx4
I have a dream so I study hard!!!