Shell脚本简介 — 持续更新
一、什么是Shell脚本
- Shell脚本是用户与Linux操作系统沟通的桥梁;
- Linux的Shell种类较多,因bash易用、免费,并且多数Linux系统默认的Shell是Bash。
二、Shell脚本文件格式
- 文件名后缀通常是.sh
1 #!/bin/bash 2 #或者 3 #!/bin/sh
三、脚本任何执行?
- a.sh 需保证脚本有执行权限并在环境变量中有(.),这样在执行时会从当前目录查找
- ./a.sh 需保证脚本有执行权限
- /usr/local/a.sh 需保证脚本有执行权限
- bash a.sh 可直接执行,甚至脚本文件中不需引入/bin/bash,它将a.sh作为参数传给bash/sh命令来执行
四、变量
- 变量不需要声明且初始化不需要指定类型
- 变量命名要求:(1)、不能使用程序中的保留字;(2)、变量由字母、数字、下划线组成,且不能以数字开头;(3)、建议命令要通俗易懂
- 显示变量值使用echo $变量名,也可使用${变量名}:如echo $JAVE_HOME 或 echo ${JAVA_HOME}
- 变量的分类:本地变量、环境变量、局部变量、位置变量、特殊变量
(1)、本地变量
- 只对当前shell进程有效,对当前进程的子进程及其他shell进程无效;
- 定义:VAR_NAME=VALUE
- 变量引用:${VAR_NAME}
- 取消变量:unset VAR_NAME
- 类比:相当于java中的私有变量,只能当前类使用,子类和其他类无法使用
(2)、环境变量
- 自定义的环境变量只对当前shell及其子shell进程有效,对其他shell进程无效
- 定义:export VAR_NAME=VALUE
- 对所有shell进程都有效则需要配置到/etc/profile文件中,并source /etc/profile使生效
- 类比:相当于java中protected修饰符,对当前类和当前类的子孙类,以及同一个包下面可以共用
(3)、局部变量
- 在函数中调用,函数执行结束时变量会消失
- 对shell脚本中某代码片段有效
- 定义:local VAR_NAME=VALUE
- 相当于java代码某个方法中定义的变量,只对这个方法有效
(4)、位置变量
- $1,$2.....${n}
- test.sh 20 30 —>$0:脚本自身;$1:脚本的第一个参数;$2:脚本的第二个参数
- 相当于java main函数中的args参数,可以获取外部参数
(5)、特殊变量
- $?:接收上一条命令的返回状态码(取值区间:0~255)
- $#:参数个数
- $*或$@:所有的参数
- $$:获取当前shell的进程号(可实现脚本自杀,或使用exit命令直接退出、或使用exit[num])
五、单引号、双引号、反引号
- " 单引号不解析变量
- "" 双引号会解析变量
- `` 反引号是执行并引用一个命令的执行结果,类似于$(...)
六、for循环
格式1 for ((i=0;i<10;i++)) do ... done 格式2 for i in 0 1 2 4 5 8 9 do ... done 格式三 for i in {0..9} do ... done
七、条件测试
- bash条件测试
命令执行成功与否即为条件测试
test EXPR
[ EXPR ]:注意中括号和表达式之间的空格
2. 整型测试:
-gt:大于:例如[ $num1 -gt $num2 ]或者test $num1 -gt $num2
-lt:小于
-ge:大于等于
-le:小于等于
-eq:等于
-nq:不等于
3. 字符串测试:
> 大于[ "$str1" \> "$str2" ] 注意测试符号左右的空格
< 小于
= 等于
!=不等于
#!/bin/bash while [ 1 -eq 1 ] do for ((i=0;i<10;i++)) do if [ $i -eq 2 ] then break fi echo $i done echo '*********' sleep 3 done
#!/bin/bash while [ 1 -eq 1 ] do for ((i=0;i<10;i++)) do if [ $i -eq 2 ] then #break 默认值为1,表示跳出第一层循环;值为2时,表示跳出第二层循环 break 2 fi echo $i done echo '*********' sleep 3 done
Linux 帮助命令
- help/man
- linux中的命令可以分为两种,内建命令:command is a shell builtin;外部命令:显示具体的路径
- 如何区分命令属于哪一种:type command
- 内建命令使用help command,外部命令使用man command
[xfvm@xfvm01 ~]$ type cd
cd is a shell builtin
[xfvm@xfvm01 ~]$ type ls
ls is aliased to `ls --color=auto'
[xfvm@xfvm01 ~]$ type date
date is /bin/date [xfvm@xfvm01 ~]$
爱家,更要爱技术。