shell笔记
2018-09-23 本文已影响0人
MkTom
3天 自动化运维
shell语法
项目发布
1、shell
shell是一个命令解释器,实际是一个程序,/bin/bash,linux中所有的命令都由它来解释,有自己的语法
shell脚本
以.sh结尾
shell语法+linux命令
注释:
单行注释 : #
多行注释 : :<<c c
shell执行方式
bash /path/to/script-name 或 /bin/bash /path/to/script-name (强烈推荐使用)
/path/to/script-name 或 ./script-name (当前路径下执行脚本)
source script-name 或 . script-name (注意“.“点号后面有空格)
前两种执行时,都会开启新的进程执行脚本
source不会开启新的进程
使用source时,可以与当前终端共享进程,共享变量(重点)
变量
1、name=itcast
2、name='itcast $age' 不会解析里面的遍历
3、name=”itcast $age“ 解析变量后,再拼接成新的字符串
命令变量(重点)
1、name=`ls`
2、name=$(ls)
括号里必须是linux命令,把命令执行的结果记录给变量
全局变量
方法一:
变量名=值
export 变量
方法二:(最常用)
export 变量名=值
如果是在终端中定义全局变量,作用范围是当前终端及子进程
(重点)
如果想要自己定义的全局变量在跟系统的全局变量一样在所有环境都有效,需要在~/.bashrc或/etc/profile文件中定义:
修改~/.bashrc后,直接打开新的终端,定义的全局变量就生效了,此方式只对当前用户有效
修改/etc/profile时,需要重启操作系统,定义的全局变量才生效,此方式对所有用户有效
上面两种方式在修改文件后,如果想让全局变量在当前终端生效,需要执行命令source ~/.bashrc或source /etc/profile
查看变量
标准使用方式:"${变量名}"
内置(重点)
$0 获取当前执行的shell脚本文件名
$$ 获取执行shell脚本的进程号
$n 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10}
$# 获取当前shell命令行中参数的总个数
$? 获取执行上一个指令的返回值(0为成功,非0为失败)
$?:上一条命令是执行一个文件,返回的结果是文件中的最后一条命令
默认值
1、(重点)
变量a如果有内容,那么就输出a的变量值
变量a如果没有内容,那么就输出默认的内容
格式:
${变量名:-默认值}
2、
无论变量a是否有内容,都输出默认值
格式:
${变量名+默认值}
测试语句(重点)
等号左右必须有空格,中括号左右必须有空格
test a = 1
[ a = 1 ]
逻辑表达式
&&符号
命令1 && 命令2
如果命令1执行成功,那么执行命令2
如果命令1执行失败,那么不执行命令2
||符号
命令1 || 命令2
1 如果命令1执行成功,那么不执行命令2
2 如果命令1执行失败,那么执行命令2
文件表达式
判断是否是可执行文件
[ -f abc ] && [ -x abc ]
计算表达式
a=$((a+1))
let a=a+1
重定向
命令>文件
命令返回的结果又正确和错误两种,1代表正确,2代表错误
bash chongdingxiang.sh >/dev/null 2>&1 &
把正确的和错误的结果都输出到黑洞文件,而且命令在后台执行
linux四剑客
grep
grep -nr 关键字 .
find
find . -name "*sh"
sed
行编辑工具
-i 真正的修改
s:替换
a:追加
i:插入
d:删除
sed -i "s#sed#SED#g" sed.txt
每一行找到sed,把所有的替换为SED
sed -i "2s#SED#sed#2" sed.txt
第二行的第二个SED替换为sed
sed -i "1,4a\hello2" sed.txt
在1到4行的每一行后追加一行内容
sed -i "1i\hello3" sed.txt
在第1行前插入一行
sed -i "2d" sed.txt
删除第2行
awk
分析工具,按行处理
awk 'BEGIN{FS=":";OFS="--"} {print $2,$NF}' awk2.txt
默认按照空格或tab键拆分数据,通过OFS指定输出时的分隔符
流程控制
if语句
if [ 条件 ]
then
指令1
elif [ 条件2 ]
then
指令2
else
指令3
fi
1 #!/bin/bash
2
3 read -p "请输入性别:" sex
4 if [ "$sex" == "nan" ]
5 then
6 echo "输入的是男"
7 fi
case语句
1 #!/bin/bash
2
3 case "$1" in
4 "start")
5 echo "启动"
6 ;;
7 "stop")
8 echo "停止"
9 ;;
10 "restart")
11 echo "重启"
12 ;;
13 *)
14 echo "。。。。"
15 ;;
16 esac
for循环
遍历文件夹
1 #!/bin/bash
2
3 mkdir ../bak
4 for file in $(ls)
5 do
6 # echo "file: $file"
7 cp "$file" ../bak/"${file}-bak"
8 done
seq命令
1 #!/bin/bash
2
3 for num in $(seq 5)
4 do
5 echo "num: $num"
6 done
while循环
1 #!/bin/bash
2
3 count=1
4 while [ $count -lt 5 ]
5 do
6 echo "count: $count"
7 let count=count+1
8 done
until循环
1 #!/bin/bash
2
3 count=1
4 until [ $count -ge 5 ]
5 do
6 echo "count: $count"
7 let count=count+1
8 done
函数
1 #!/bin/bash
2
3 echo "jiaoben : $1,$2,$3"
4 dayin(){
5 if [ $# = 3 ]
6 then
7
8 echo "hanshu : $1,$2,$3"
9 else
10 echo "需要3个参数"
11 fi
12 }
13
14 #dayin e f g
15 dayin $1 $2 $3
使用source执行脚本,脚本中定义的变量和函数都能在当前终端调用
让root用户能够使用python虚拟环境
export WORKON_HOME=/home/python/.virtualenvs/
source /usr/local/bin/virtualenvwrapper.sh
linux操作
连接
windows连接linux
使用xshell
linux\mac连接linux
使用ssh:ssh python@192.168.133.135
sudo passwd 启用root用户
使用root用户远程连接
1、修改配置文件
sudo vi /etc/ssh/sshd_config
2、修改下面内容
PermitRootLogin prohibit-password
PermitRootLogin yes
3、重启ssh服务
service ssh restart
传输文件
apt install lrzsz
windows中
上传
连接远程服务器,切换到某个目录,输入rz,选择文件
下载
连接远程服务器,切换到某个目录,输入sz 文件,选择保存的路径
linux中
scp 源文件 目标
下载
scp python@192.168.133.135:/home/python/Desktop/heha .
上传
scp heha python@192.168.133.135:/home/python/Desktop/
linux免密登录认证
1、A连接B,A申请一对钥匙
ssh-keygen -t rsa
拷贝公钥
cat /root/.ssh/id_rsa.pub
2、B服务器修改配置文件
vi /etc/ssh/sshd_config
取消下面内容的注释
AuthorizedKeysFile %h/.ssh/authorized_keys
3、创建文件
vi /root/.ssh/authorized_keys
保存A服务器的公钥
4、B服务器重启ssh服务
service ssh restart