shell编程
变量
变量的分类:
- 用户变量:用户自己定义的变量
- 系统变量:系统已经定义的变量,在整个Linux系统中起作用
- 特殊变量
变量的类型:
变量的分类:
- 用户变量:用户自己定义的变量
- 系统变量:系统已经定义的变量,在整个Linux系统中起作用
- 特殊变量
变量的类型:
变量定义的格式:
1 2 3 4 5 6 7 8 9
| 变量名=变量值 #注意=左右两边不可以有空格 #直接赋值 username="ygm" #键盘赋值 read username #执行的命令结果赋值 str=$(pwd) str=$(ll) str=`ps -ef`
|
变量的访问
1 2 3
| #!/bin/bash echo $name echo $echo{name}
|
特殊变量
变量名 |
定义 |
$# |
命令行参数的个数 |
$? |
前一个命令或函数的返回码 |
$n |
$1表示第一个参数 |
$0 |
当前程序的名称 |
$* |
以“参数1,参数2···”保存所有参数 |
字符串
结论:推荐编程的时候使用双引号
1 2 3 4 5 6 7 8 9 10 11
| str=hello str=`hello` str="hello"
str2='I am ${str}' #单引号不会解释字符串里面的变量 str2="I am ${str}" #双引号可以解释字符串里面的变量
#输出字符串的长度 echo ${#name} #提取子字符串 echo ${string:a:b} #从索引(索引从0开始)为a个位置开始截取长度为b的子字符串
|
算数运算符
算数运算在shell中要遵守严格的规范格式
1 2 3 4 5 6 7 8 9 10 11
| echo `expr 2 + 3` #必须是反引号包裹、加号与数字之间留有空格 echo `expr 2 \* 3` #注意乘法和除法必须使用转义符号\前缀才会起作用 echo `expr 2 \% 4`
#此外,算数运算还可以用$(())和$[]表示-推荐方式 a=2 b=3 echo $((a+b)) echo $(($a+$b)) echo $[a+b] echo $[$a+$b]
|
比较运算
数字比较
- -eq:比较两个数是否相等,相等返回true
- -ne:比较两个数是否不想等,不想等返回true
- -gt:检测左边的数是否大于右边,若是返回true
- -lt:检测左边的数是够小于右边,若是返回true
- -ge:检测左边的数是否大于等于右边,若是返回true
- -le:检测左边的数是否小于等于右边,若是返回true
字符串比较:
- -z STRING:字符串长度为0
- -n STRING:字符串长度不为0
- =:判断字符串长度是否相等
- !=:判断字符串长度是否不想等
文件:
-f:存在且普通的文件
-e:文件存在
-d:存在且是目录
-h:存在且是链接
-r:存在且是只读
-w:存在且是可写
-x:存在且是可执行
数组
数组用小括号表示,中间元素用空格隔开,也可以直接定义数组中的每个元素的值。
1 2 3 4 5 6 7 8 9 10 11
| array=(1 2 "hello" ygm) array[4]="xyc"
#读取数组元素 echo ${array[index]} #读取整个数组 echo ${array[*]} echo ${array[@]} #获取数组长度 echo ${#array[*]}
|
shell命令
1 2 3 4 5 6 7 8
| 逻辑运算符&&和||
&& 表示与,|| 表示或 二者具有短路原则: expr1 && expr2:当expr1为假时,直接忽略expr2 expr1 || expr2:当expr1为真时,直接忽略expr2 表达式的exit code为0,表示真;为非零,表示假。(与C/C++中的定义相反)
|
判断语句
if判断语句范式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| if condition then ··· else ··· fi
if[ "a" -lt "b" ] && [ "a" -gt 2] then echo ${a}在范围内 fi
if[ $a -eq 2] then echo ${a}等于2 elif [ $a -eq 3] then echo ${a}等于3 else echo 其他 fi
|
循环语句
for范式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| for v in var1 var2 var3 do echo $v done
for flie in `ls` do echo $file done
for i in $(seq 1 10) do echo $i done
for ((i = 1;i<10;i++)) do echo $i done
|
while循环范式:
1 2 3 4 5 6 7 8 9
| while read name do echo $name done
until ["${word}" == "yes"] || ["${word}" == "YES"] do read -p "please input yse or YES to stop this program:" word done
|
PS3使用方法
1 2 3 4 5 6 7
| echo "what is your favourite OS?" PS3="please enter your chose:" select var in "linux" "windowns" "unix" do break; done echo "you have selected $var"
|
一键安装JDK
使用shell脚本实现自动化部署
jdk_install.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #!/bin/bash #提示安装jdk echo "开始安装jdk" sleep 1 #删除自带的jdk oldjdk=$(rpm -qa | grep jdk) for old in ${oldjdk} do #echo $old rpm -e --nodes $old done #创建安装目录 java_path=$(/export/server) if[ !-d $java_path] then mkdir -p $java_path fi #解压jdk安装包 tar -zxvf /export/softwore/jdk-8u241-linux-x64.tar.gz -C $java_path #设置环境变量 JAVA_HOME="/export/server/jdk1.8.0_241" grep "JAVA_HOME" /etc/profile if[ #? -ne 0] then #JAVA_HOME echo "---------JAVA_HOME-----------" echo `export JAVA_HOME=/export/server/jdk1.8.0_241` >> /etc/profile #PATH echo "----------PATH-----------" echo `export PATH=:$JAVA_HOME/bin:$PATH` >> /etc/profile fi #加载环境变量 sleep 1 source /etc/profile #安装完成提示 echo "恭喜您jdk安装成功!" java -version
|