linux学习总结----shell编程
## 环境变量
## 全局变量
```
常见的全局环境变量
PATH 指令的搜索路径
HOME 用户的家目录
LOGNAME 登录名
SHELL 脚本的类型
使用全局环境变量
echo $PATH
自定义全局变量
name='kangbazi'
echo $name;
配置系统环境变量
vim /etc/profile
export name=1804
source /etc/profile
echo $name
```
### 设置path环境变量
```
echo $PATH
1.对所有的用户生效
sudo vim /etc/profile
export PATH=$PATH:/usr/local/mysql/bin 给 mysql 添加 path环境变量 类似于windows 中
此电脑->右键属性->高级系统设置->环境变量 ->系统环境变量->path
source /etc/profile 让配置文件立即生效
2.对登录的用户有效
sudo vim /root/.bashrc
export PATH=$PATH:/usr/local/mysql/bin
sudo source /root/.bashrc
```
## shell编程
> 命令解释器 将用户输入的命令 解释给 操作系统内核
### 执行命令的方式
1.交互式 用户输入一条命令 比如 rm -rf /*
2.批处理式的
将多个命令汇集成一个脚本 一次将这次命令执行完毕
```
#!/bin/bash
which ls
cd /usr/local/nginx
mv test.txt /tmp/
```
### 脚本批处理式
需求: 如果实线某个需求 同时2个或者三个服务启动
nginx
mysql
apache2
test start 实线下面三个全部启动 重启 停止
service nginx restart|start|stop
service mysql start|restart|stop
service apahce2 start|restart|stop
```shell
#!/bin/bash
if [ $1 == "start" ]
then
service nginx start
service mysql start
service apache2 start
fi
if [ $1 == "stop" ]
then
service nginx stop
service mysql stop
service apache2 stop
fi
if [ $1 == "restart" ]
then
service nginx restart
service mysql restart
service apache2 restart
fi
```
> 开头必须是 #!/bin/bash
>
> 后缀名 一般 是以 .sh
>
> 脚本要有执行权限 chmod +x 脚本.sh
>
> ./脚本.sh 运行 ./
>
> /etc/init.d/test.sh 绝对执行
```shell
#是shell脚本中的注释 第一行比较特殊
#!/bin/bash
cd /
ls -al
:wq!
chmod +x 1.sh
./1.sh
/tmp/1.sh
```
## shell 变量
> 局部变量 只能在当前shell中运行
>
> 全局变量 应用于整个系统 一般大写
```
#!/bin/bash
设置局部变量
a=10 等号两边不能留空格
b=$a
显示局部变量
echo $a 10
echo ${b} 10
echo "a=$a" a=10 双引号解析变量
销毁变量
unset a #这时候不要加$
b=`date` 将系统命令结果赋值给一个变量 命令用`` 包起来
```
位置变量
```
$0 表示的是脚本的名称
$1~$9 传递给脚本的参数
```
## 特殊变量
```
$# 表示传递给脚本的参数个数
$* 传递给脚本的所有参数
$? 表示命令的返回值 0表示成功
```
### 常量
```
readonly a=10
echo $a
a='66'
echo $a #报错 表示 a 是常量 不能修改
```
### 引号
>双引号解析变量
>
>单引号不解析变量 不解析转移字符
>
>`` 能够输出命令的结果
>
>特殊字符 反斜线转义
>
>& * ?^
>
>
>
>\ 转义字符
### 字符串
```
计算字符串的长度
#!/bin/bash
test='123456abc' ${#字符串的名字}
echo ${#test}
提取字符串
${字符串的名字:开始的位置:截取的长度}
echo ${test:3:5} 456ab
```
### 数组
```
a=(1 2 3) #声明一个数组 元素之间 用空格隔开
获取数组的元素 #{a[0]} 1
获取数组的长度 echo ${#a[@]} echo ${#a[*]}
```
## seq
```
seq 5-10 生成5-10之间的连续整数
```
## 运算
#### 数学运算
```
a=100
echo $[$a+10]
echo $[$a-5]
echo $[$a/2]
echo $[$a*2]
echo $[$a%2]
~
echo $((5+10))
echo $((10/2))
echo $((10/3)) 3 整除 余数忽略掉了
```
## 逻辑运算
&&
```
if [ $a != 100 && $b ==100 ]
```
||
```
if [ $a != 100 || $b ==100 ]
```
## 关系运算符
| 运算符 | 说明 |
| ---------- | ------------- |
| -eq == | a -eq b 相等 |
| -ne != | a -ne b |
| -gt > | a -gt b |
| -lt < | a -lt b |
| -ge >= | |
| -le <= | |
| | |
| | |
## 字符串判断
| 运算符 | 说明 |
| ------ | ---------------------------------- |
| = | 字符串是否相等 |
| != | 不等 |
| -z | 字符串的长度是否为0 为0返回true |
| -n | 字符串的长度是否为0 不为0返回true |
| str | 检测字符串是否为空 不为空返回true |
| | |
| | |
## 文件的判断
| 运算符 | 说明 |
| -------- | ------------------------------------------ |
| -d 文件 | 检测是否是目录 是返回true |
| -f 文件 | 检测是否是普通文件 (不是目录不是设备 ) |
| -r 文件 | 检测文件是否只读 |
| -w 文件 | 检测文件是否可写 |
| -x 文件 | 是否可执行 |
| -s 文件 | 检测文件是否为空 也就是说文件的大小是否为0 |
| -e 文件 | 检测文件是否存在 存在返回true |
### 分支语句
#### if-else
```
#!/bin/bash
read -p '请输入您的分数:' score
if [ $score -gt 80 ] 中括号前后有空格
then
echo '优秀'
else
echo '一般'
fi
if [ $score -gt 80 ];then
echo '优秀'
else
echo '一般'
fi
```
#### case
```
case $变量名 in
模式1)
命令1
;;
模式2)
命令2
;;
默认执行的命令
;;
esac
switch(){
case 1:
default
}
```
```
#!/bin/bash
case $1 in
start| begin)
echo 'start'
;;
stop | end)
echo 'stop'
;;
*)
echo 'i dont know'
esac
./2.sh start
```
## 循环语句
```
for 变量 in 列表
do
命令1
命令2
done
for i in 1 2 3 4 5;do
echo $i
done
//从命令中读取值
for j in `cat 1.txt`;do
echo $j
done
读取目录列表
for file in /home/*;do
echo $file
done
求1-100的和
for x in `seq 1 100`;do
let sum+=$x
done
echo $sum
遍历数组
a=(1 2 3 4 5 6)
for i in ${a[*]};do
echo $i
done
```
## while
```
while 条件
do
命令
done
sum=0
i=0
while [ $i -lt 100 ];
do
let sum+=$i
let i+=1
done
echo $sum
```
## 函数
```
先定义 后使用
test(){
echo 'hello world'
}
test
```
切换yum 源头
```
1.cd /etc/apt
准备 两个source.list 一个是公司的 一个是阿里云
```
```shell
#!/bin/bash
rm -rf /etc/apt/source.list
read -p '请选择内网还是阿里云(1 内网 2 阿里云):' network
if [ $newwork -eq 1 ];then
echo '你选择了内网'
cp -r /tmp/source.list /etc/apt/
else
echo '你选择了阿里云'
cp -r /tmp/aliyun/source.list /etc/apt/
fi
sudo apt-get update
sudo apt-get upgrade
```
```
chmod +x 脚本名称.sh
```
### 远程登录 公钥加密 私钥解密
```
ssh 用户名@ip地址
exit 退出远程登录
建立两台主机之间的信任关系
1.10.8.152.117
2.10.8.152.95
第一步: 在 95上
ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_j_rsa 可以自己起名字防止覆盖掉原来的密钥 英文状态下写
Enter passphrase (empty for no passphrase): 回车
Enter same passphrase again: 回车
cat id_j_rsa.pub
复制内容 注意 别复制多 也别复制少
第二步 :
在 117 上
mkdir -p /root/.ssh
cd /root/.ssh
vim authorized_keys
粘贴第一步复制的内容
保存
chmod 600 /root/.ssh/authorized_keys 这一步相当重要
第三步: 在95上 ssh@10.8.152.117 这个时候就不需要输入密码
```
## 远程复制
```
scp -r 源地址 目标地址
scp text.txt root@10.8.152.117:/tmp 将本机的文件 复制到 目标主机的tmp目录下面
scp root@10.8.152.117:/root/text.txt /tmp
scp -r root@10.8.152.117:/root/www /tmp 将远程
```
### screen
```
sudo apt-get install screen
screen -S 自己命名
执行任务
ctrl+a+d 退出会话 回到主窗口
screen -r 窗口名字 进入指定的子窗口
screen -X -S 窗口名 quit 结束指定的 子窗口 任务
```
### 磁盘管理
```
HDD 机械硬盘
HHD 混合硬盘
SDD 固态硬盘
文件系统类型
windows ntfs fat32 fat16 exfat
Linux ext4 ext3 ext2
```
### 查看磁盘的使用情况 df
```
第一块磁盘 sda
第二块就是 sdb
第三块 sdc
df -h 以最佳阅读体验阅读磁盘的使用情况
df -k 以k为单位
df -m 以m为单位
df -h /dev/sda2
```
## 查看文件 及目录对空间的使用情况 du
```
du -a 显示所有文件目录大小 包括隐藏文件
du -h 最佳阅读体验阅读
du -s 只显示目录大小 不显示子目录和文件的大小
du -c 显示目录及文件的大小 并显示总大小
```
## 磁盘分区 fdisk 先分区 再格式化 然后挂载
```
fdisk -l 查看磁盘的分区情况
发现多了一个 /dev/sdb
fdisk /dev/sdb
m 帮助
n 新建一个分区
d 删除一个分区
w 保存
q 退出
新建一个分区
新建主分区 primary 然后 extends 扩展分区
n -p-默认回车-默认回车-+8G-w
格式化
fdisk -l 发现多了一个 /dev/sdb1
mke2fs -t ext4 /dev/sdb1
-t表示 制定文件系统类型
挂载
mkdir -p /python1804
mount -t ext4 /dev/sdb1 /python1804 临时挂载 注销 重启 这个磁盘就没了
df -h
发现 多了一个/dev/sdb1
取消挂载
umount /python1804/
df -h
/dev/sdb1 就没了
永久挂载
vim /etc/fstab
/dev/sdb1 /python1804 ext4 defaults 0 0
新磁盘 挂载点 文件系统类型 默认参数 0 是否需要备份 0不备份 0 是否开机检查磁盘 0 不检查
mount -a 让挂载立即生效
```
### 别名
```
有的命令 加参数 很繁琐 可以根据团队的要求 重新命名 为了提高效率
vim /root/.bashrc
alias 新名字='命令 参数'
alias c='cd'
source /root/.bashrc #让配置未见立即生效
```
linux学习总结----shell编程的更多相关文章
- Linux学习之Shell编程基础
转自:http://my.oschina.net/itblog/blog/204410 1 语法基本介绍1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来 ...
- Linux学习之socket编程(二)
Linux学习之socket编程(二) 1.C/S模型——UDP UDP处理模型 由于UDP不需要维护连接,程序逻辑简单了很多,但是UDP协议是不可靠的,实际上有很多保证通讯可靠性的机制需要在应用层实 ...
- Linux 与 unix shell编程指南——学习笔记
第一章 文件安全与权限 文件访问方式:读,写,执行. 针对用户:文件属主,同组用户,其它用户. 文件权限位最前面的字符代表文件类型,常用的如 d 目录:l 符号链 ...
- (零)linux 学习 -- 从 shell 开始
The Linux Command Line 读书笔记 - 部分内容来自 http://billie66.github.io/TLCL/book/chap02.html 文章目录 前言 什么是 she ...
- Linux与Unix shell编程指南(完整高清版).pdf
找到一本很详细的Linux Shell脚本教程,其实里面不光讲了Shell脚本编程,还介绍了系统的各种命令 http://vdisk.weibo.com/s/yVBlEojGMQMpv 本书共分五部分 ...
- LInux回顾与Shell编程
一.Linux回顾 因为要学习Hadoop大数据,会用到Linux服务器集群来做,因此有必要回顾一下当年大一所学习的Linux知识 ①Linux系统有7个运行级别(runlevel): 运行级别0:系 ...
- Linux下的Shell编程
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...
- (原创)鸟哥linux学习script shell相关笔记
在使用鸟哥linux进行script shell学习的过程中碰到一些不太明白的知识点,在这里进行一些记录 1. [root@www scripts]# vi sh03.sh #!/bin/bash # ...
- linux下的Shell编程(3)shell里的流程控制
if 语句 if 表达式如果条件命令组为真,则执行 then 后的部分.标准形式: if 判断命令,可以有很多个,真假取最后的返回值 then 如果前述为真做什么 [ # 方括号代表可选,别真打进去了 ...
随机推荐
- 在eclipse中配置Tomcat时,出现“Cannot create a server using the selected type”的错误。
出现原因:Tomcat重新安装,并且安装目录改变了. 解决方案:在“Window->preferences->Server->Runtime Environment”,编辑Tomca ...
- CodeForces - 616C(很有意思的bfs,set,map的使用)
传送门: http://codeforces.com/problemset/problem/616/C C. The Labyrinth time limit per test 1 second me ...
- MySQL优化之Explain命令解读
简述: explain为mysql提供语句的执行计划信息.可以应用在select.delete.insert.update和place语句上.explain的执行计划,只是作为语句执行过程的一个参考, ...
- 基于kafka rest实现资源访问服务化(实战)
问题引出 新产品的体系架构包含多个模块,模块集特点是数量多.模块间交互复杂.那么统一接口是一个很好的解决方案,为了实现统一接口打算采用微服务的核心思想,设计了采用restful service的数据交 ...
- Reading Notes : 180214 计算机的总线结构
读书<计算机组成原理>,百度百科 基本上接触过计算机的人,都多少知道计算机的具体构成,但是真正能讲明白的却说了很多,本节将讲解一下计算机的基本硬件构成和一些基本信息,简单认识,以后再深入了 ...
- MyBatis之Mapper XML 文件详解(三)-Result Maps
resultMap 元素是 MyBatis 中最重要最强大的元素.它就是让你远离 90%的需要从结果 集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许你做一些 JDBC 不支持的事 情 ...
- JS原生评分组件
JS原生评分组件 <html> <head> <meta http-equiv="Content-Type" content="text/h ...
- Java分布式锁之数据库方式实现
之前的文章<Java分布式锁实现>中列举了分布式锁的3种实现方式,分别是基于数据库实现,基于缓存实现和基于zookeeper实现.三种实现方式各有可取之处,本篇文章就详细讲解一下Java分 ...
- font(字体)所使用的属性
1.font-weight:normal blod bolder lighter 100-900之间 400=normal p:first-child{ padding-top: 50px; pos ...
- Android小例子:使用反射机制来读取图片制作一个图片浏览器
效果图: 工程文件夹: 该例子可供于新手参考练习,如果有哪里不对的地方,望指正>-< <黑幕下的人> java代码(MainActivity.java): package co ...