SHELL基础

时间:2019-02-11
本文章向大家介绍SHELL基础,主要包括SHELL基础使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

shell基础复习

shell 用户与系统内核之间交流平台

shell类型

/bin/sh
/bin/bash(系统默认bash)
/bin/tcsh
/bin/csh
/etc/shells 放置当前系统可用shell

为什么需要shell编程

1,减少繁琐工作的重复进行,减少错误
2,提高工作效率
3,事态的批量化进行
##bash特点功能
1,查看历史命令(默认1000条)
①history查看历史命令
②histoty - c 清空历史命令
③配置文件在 /etc/profile 下
2,别名
①Alias h5 = ‘head-5’ #生成别名
②Unalias h5 #取消别名
案例
[root@bogon ~]# alias h5=‘head -5’# gead默认查看10行 现在修改成查看5行 并 给它一个别名
[root@bogon ~]# h5 etc.tar ##使用这个别名去查看文件 只能查看5行
[root@bogon ~]# unalias h5 ##取消别名
3,管道符重定向
①Ps aux | grep ‘3306’ #ps 显示全端口 查看3306端口
②Ls > list.txt # ls 显示的信息到list.Txt文件里
③Ls - l > list.txt # ls显示出来的错误信息到list.txt文件中
④Mail -s test xx@baidu.Com < list.txt #发邮件到xx百度 邮件内容是list里面的

4,命令序列的使用技巧
在linux中,可以使用控制字符(; && || &)
&:将程序后台执行
Firefox & #将firefox放到后台执行 也可以用ctrl+z
Jobs 查看后台任务
Fg n 将后台任务n拿到前台
;:组合多个命令,命令间没有任何逻辑关系,顺序执行
&&:组合多个命令,前一个命令执行成功才执行后一个
|| : 组合多个命令,前一个执行失败 才会执行后一个
5, 花括号{}使用技巧
通过花括号可以生成命令行或者脚本所需的字符串
括号中可以包含连续的序列或使用逗号分割多个项目
连续的序列需要包括一个起点和一个终点,俩者之间用…分割
案例
[root@bogon ~]# mkdir /tmp/dir{1,2,3}
[root@bogon tmp]# mkdir /tmp/dir{5…8}
[root@bogon tmp]# cd /tmp
[root@bogon tmp]# ls
dir1 dir2 dir3 dir5 dir6 dir7 dir8 yum.log
[root@bogon tmp]# rm -rf /tmp/dir{1…9}
#####也可以用echo来输出显示
[root@bogon ~]# echo {1…28…3}
1 4 7 10 13 16 19 22 25 28
[root@bogon ~]# echo {2…-1}
2 1 0 -1

变量

#变量是用来存储非固定值的载体,它具有一个值,以及零个或多个属性
#创建变量语法格式:
Name=[value]
1, 变量如果没有指定值(value),变量将被赋值为空字符串
2,变量定义后调用$变量名 来调用变量
3,变量的名称为字母,数字,下划线组合
4,但首字母不能为数字 (变量名称,,不是变量赋值)
5,变量名无硬性的大小写要求,建议使用大写或首字母大写
6,变量的值可修改,属性可以通过typeset进行修改
7,可以用declare创建一个空变量,暂时不赋值
Declare SC #创建一个空变量
Typeset - i SC #空变量改为整数属性
SC=QQQ ##将qqq强制赋值给变量sc #sc变量打印出结果是0 这是因为sc变量已经改为数值行 除数值外其他赋值都输出0
案例
1[root@bogon ~]# sc=2 ##赋值变量 等号左右不要有空格
[root@bogon ~]# echo $sc
2 [root@bogon ~]# SC=‘北京’ #变量sc 赋值北京
[root@bogon ~]# echo $SC #打印变量sc
北京
[root@bogon ~]# SC=‘鱼老板’ #修改变量sc
[root@bogon ~]# echo KaTeX parse error: Expected 'EOF', got '#' at position 8: SC #̲打印变量sc ‘鱼老板’ [r…
[root@bogon ~]# SC=‘煤老板’ #修改变量sc 修改不了 权限已经改成了只读
-bash: SC: readonly variable ##报错信息
8,通过read命令设置变量
Read从标准输入中读取变量值
案例
[root@bogon ~]# read qq ## read后跟一个变量
Wwwww ###变量里的赋值
[root@bogon ~]# echo $qq #打印这个变量
Wwwww #打印结果
-p选择添加相应的提示信息
[root@bogon ~]# read -p “nihao” ee ##设置变量ee
nihao,enen #打印出来,在添加一句话
[root@bogon ~]# echo $ee #打印这个变量
,enen ##显示添加的这句话
9,Set 查看当前系统中设置的所有变量和值
Unset #删除变量
Unset 变量名
案例
[root@bogon ~]# set | grep ww ## 查看ww变量的值
_=wwwwww
ww=wwwwww
[root@bogon ~]# unset ww #删除这个变量
[root@bogon ~]# set | grep ww #从新查看
_=ww #无值

10,变量的作用范围
使用name=【value】创建变量,默认在当前shell中生效,子进程不会继承这样的变量
使用export命令将变量放置到环境变量中,此时可全局使用 (设置变量范围)
Export可以直接定义环境变量并赋值
也可以先定义一个普通的用户变量,然后通export转换为环境变量
案例
[root@bogon ~]# read sc #在bash下生产一个变量
Eeee
[root@bogon ~]# echo $sc #打印出来
eeee
[root@bogon ~]# exit #退出
exit
[root@bogon ~]# echo $sc #从原来的bash上查看变量 是空的
#变量是不通用的,可以设置变量范围
[root@bogon ~]# rr=‘scscsc’ ##在bash生成一个变量 rr
[root@bogon ~]# echo $rr #打印 rr
scscsc
[root@bogon ~]# export rr #把变量 rr 扔到全局
[root@bogon ~]# echo $rr #打印 rr
scscsc
[root@bogon ~]# bash 切换 bash
[root@bogon ~]# echo $rr 打印rr
Scscsc #出结果 成功
[root@bogon ~]# export tt=‘tttt’ #在变量范围内设置变量 tt
[root@bogon ~]# echo $tt 打印 变量tt
Tttt #出结果
[root@bogon ~]# bash #切换 bash
[root@bogon ~]# echo tt #打印变量tt
Tt #出结果
环境变量
Bash为我们预设了很多环境变量,实际操作中我们可以直接调用这些变量(bash手册)
SHELL 查看当前系统的默认bash
HOSTNAME 查看系统的主机名
BASHPID 查看当前bash进程的进程号
UID 查看当前用户的id号
HOME 查看当前用户的家目录
PWD 查看当前工作目录
PS1 主命令提示符
PS2 此命令提示符
RANDOM 1-32767之间的随机数
PATH 命令搜索路径
案例
[root@bogon ~]# echo $SHELL #查看当前系统的默认bash
/bin/bash
[root@bogon ~]# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

#path
添加PATH路径:
PATH=KaTeX parse error: Expected 'EOF', got '#' at position 14: PATH:/root #̲追加 注意:绝对不能用下列方法…PATH:/root/bin/python #追加py路径
[root@bogon ~]# echo $PATH #显示
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin/python #python路径已经追加到环境变量里了

##位置变量(主要体现在脚本中)
位置变量使得脚本中命令可以调用脚本时不同位置参数,参数之间一般用空格隔开

$0 :代表当前shell程序的文件名称
$1 :代表shell程序中第一个参数
$2 :代表shell程序中第二个参数
(以此类推$1-$9)
$# 代表shell程序所有参数的个数
*和@ 都代表所有参数的内容,区别是*将所有参数作为一个整体,@将所有参数作为个体看待
$$ 代表当前进程的ID号
%? 代表程序的退出代码(0代表执行成功,非0代表执行失败)
Shell 脚本
Vim ***.sh
案例
[root@bogon ~]# bash cs.sh a b c #直接调用脚本 三个参数 a b c
this is the file name:cs.sh #这是脚本名称
this is the first parm:a #这是脚本第一个参数
this sis the second parm:b #这是脚本第二个参数
this is the number of all parm:3 #此脚本一共有三个参数

变量的展开于替换

#以下四组用于需要确定变量是否正确设置环境
${varname:-work} #当varname存在且不为空,则返回varname值,否则返回word
${vaename:=word}#当varname存在且不为空,返回varname值,否则返回word
${varname:?message}#当varname存在且不为空,返回varname值,否则
显示varname:message
${varname:+word}#当varname存在且不为空,返回word,否则返回null

案例
[root@bogon ~]# bb=vvvvvv #定义以变量
[root@bogon ~]# echo $bb #打印出来
vvvvvv
[root@bogon ~]# echo ${bb:-no user} #打印变量
Vvvvvv #发现bb变量 显示变量内容
[root@bogon ~]# echo ${bbb:-no user} ##打印变量
no user #当变量(不存在或输出错误)后,将返回花括号里的值
[root@bogon ~]# echo ${bbb:-no user};echo ${bb} #;连接 后面再打印一个变量
no user #没发现bbb变量 返回花括号里的值
Vvvvvv #在打印变量内容

[root@bogon ~]# echo ${bbb:=no user};echo ${bb} #和上个一样(这个会赋值)
no user #变量存在返回变量值 不存在返回花括号值(但这个错误或不存在的变量将会赋值 bbb在打印将会显示no user )
Vvvvvv #在打印变量

[root@bogon ~]# echo ${bbsb:?shuo sha ne};echo ${bb} #如变量不存在将会把花 括号内句子打印出来并且 后来连接;变量将不显示
-bash: bbsb: shuo sha ne #无找到这个变量 显示花括号内容 说啥呢
[root@bogon ~]# echo ${bb:?shuo sha ne};echo ${bb} #如变量能找到将显示变量内容,即连接的内容
vvvvvv
vvvvvv

[root@bogon ~]# echo ${bb:+shuo sha ne};echo ${bb} #如果变量存在返回花括号里内容以及后面连接打印变量内容
shuo sha ne #花括号内容
Vvvvvv #后面连接打印变量内容
[root@bogon ~]# echo ${bbese:+shuo sha ne};echo ${bb}#如变量不存在将不显 示花括号内容但后面连接的变量继续打印
#这是空的
Vvvvvv #这返回连接打印变量内容

#下面六组主要用于需要对变量的值做修改后输出的场景
${varname#key} #从头开始删除关键字(key),执行最短匹配
${varname##key} #从头开始删除关键字(key),执行最长匹配
${varname%key} #从尾开始删除关键字(key),执行最短匹配
${varname%%key} #从尾开始删除关键字(key),执行最长匹配
${varname/old/new}#将old替换为new,替换第一个出现的old
${varname//old//new}#将old替换为new,替换所有