shell学习笔记

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


shell学习笔记
http://example.com/2024/08/05/云计算学习笔记/
作者
Munger Yang
发布于
2024年8月5日
许可协议