变量 variable
2.9.1. 系统变量
系统变量,Shell常用的系统变量并不多,但却十分有用,特别是在做一些参数检测的时候。下面是Shell常用的系统变量
表示方法 描述 $n $1 表示第一个参数,$2 表示第二个参数 ... $# 命令行参数的个数 $0 当前程序的名称 $? 前一个命令或函数的返回码 $* 以"参数1 参数2 ... " 形式保存所有参数 $@ 以"参数1" "参数2" ... 形式保存所有参数 $$ 本程序的(进程ID号)PID $! 上一个命令的PID
命令行参数传递
[root@cc tmp]# cat test.sh echo $# echo $@ [root@cc tmp]# ./test.sh helloworld 1 helloworld
$n $# $0 $?
其中使用得比较多得是 $n $# $0 $? ,看看下面的例子:
#!/bin/sh if [ $# -ne 2 ] ; then echo "Usage: $0 string file"; exit 1; fi grep $1 $2 ; if [ $? -ne 0 ] ; then echo "Not Found \"$1\" in $2"; exit 1; fi echo "Found \"$1\" in $2"; 上面的例子中使用了$0 $1 $2 $# $? 等变量 下面运行的例子: ./chapter2.2.sh usage chapter2.2.sh Not Found "usage" in chapter2.2.sh -bash-2.05b$ ./chapter2.2.sh Usage chapter2.2.sh echo "Usage: $0 string file"; Found "Usage" in chapter2.2.sh
$? 程序运行返回值
0 表示正常结束运行, 1 表示异常退出
[root@iZ621r6pk9aZ nginx]# ping -W 2 -c 2 www.google.com PING www.google.com (172.217.24.196) 56(84) bytes of data. 64 bytes from hkg12s13-in-f4.1e100.net (172.217.24.196): icmp_seq=1 ttl=57 time=1.51 ms 64 bytes from hkg12s13-in-f4.1e100.net (172.217.24.196): icmp_seq=2 ttl=57 time=1.44 ms --- www.google.com ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 1.447/1.479/1.512/0.050 ms [root@iZ621r6pk9aZ nginx]# echo $? 0
我们ping 一个不存在的IP地址,然后 Ctrl+C 推出程序,返回值是 1.
[root@iZ621r6pk9aZ nginx]# ping -W 2 -c 2 172.16.1.100 PING 172.16.1.100 (172.16.1.100) 56(84) bytes of data. ^C --- 172.16.1.100 ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 999ms [root@iZ621r6pk9aZ nginx]# echo $? 1
如果 redis 用户不存,就创建一个名为 redis 的用户。
id redis if [ $? -eq 1 ] then adduser -s /bin/false -d /var/lib/redis redis fi
shift 移位
shift 移位传递过来的参数
$ cat test.sh echo $@ shift echo $@ $ ./test.sh aaa bbb ccc ddd aaa bbb ccc ddd bbb ccc ddd
$ cat test.sh echo $@ shift echo $@ shift 2 echo $@ $ ./test.sh aaa bbb ccc ddd eee aaa bbb ccc ddd eee bbb ccc ddd eee ddd eee
2.9.2. 表达式
!!:再次执行上一条命令 !$:上一条命令的最后一个单词 {a..b}:按照从a到b顺序的一个数字列表 {a,b,c}:三个词a,b,c. 可以这样使用 touch /tmp/{a,b,c} {$1-$9}:执行shell脚本时的命令行参数 $0:正在执行的命令名称 $#:当前启动的命令中传入的参数个数 $?:上一条命令的执行返回值。 $$:该shell的进程号。 $*:从$1开始,启动该shell脚本的所有参数。
$ mkdir -p {a..z} $ ls 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 $ mkdir -p {a..z}{0..9} $ ls a0 b0 c0 d0 e0 f0 g0 h0 i0 j0 k0 l0 m0 n0 o0 p0 q0 r0 s0 t0 u0 v0 w0 x0 y0 z0 a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1 r1 s1 t1 u1 v1 w1 x1 y1 z1 a2 b2 c2 d2 e2 f2 g2 h2 i2 j2 k2 l2 m2 n2 o2 p2 q2 r2 s2 t2 u2 v2 w2 x2 y2 z2 a3 b3 c3 d3 e3 f3 g3 h3 i3 j3 k3 l3 m3 n3 o3 p3 q3 r3 s3 t3 u3 v3 w3 x3 y3 z3 a4 b4 c4 d4 e4 f4 g4 h4 i4 j4 k4 l4 m4 n4 o4 p4 q4 r4 s4 t4 u4 v4 w4 x4 y4 z4 a5 b5 c5 d5 e5 f5 g5 h5 i5 j5 k5 l5 m5 n5 o5 p5 q5 r5 s5 t5 u5 v5 w5 x5 y5 z5 a6 b6 c6 d6 e6 f6 g6 h6 i6 j6 k6 l6 m6 n6 o6 p6 q6 r6 s6 t6 u6 v6 w6 x6 y6 z6 a7 b7 c7 d7 e7 f7 g7 h7 i7 j7 k7 l7 m7 n7 o7 p7 q7 r7 s7 t7 u7 v7 w7 x7 y7 z7 a8 b8 c8 d8 e8 f8 g8 h8 i8 j8 k8 l8 m8 n8 o8 p8 q8 r8 s8 t8 u8 v8 w8 x8 y8 z8 a9 b9 c9 d9 e9 f9 g