学习bash与脚本编程
Borne again shell 简称bash
可以使用的shell在文档/etc/shells里
bash的几个功能
历史命令:
history n列出最近n个命令
命令别名设置:
alias ll=”ls -l”
取消别名
Unalias 别名
查询命令是否为内置bash命令:type
Type name
在bash下面命令执行与快速编辑
Ctrl+u从光标处向前删除
Ctrl+k从光标处向后删除命令字符串
Ctrl+a让光标移动到命令串最前面
Ctrl+e光标移动到最后
变量使用
变量与变量内容等号=连接
name=shuiyihang
等号两边不能出现空格,若有空格应用双引或者单引号包括
双引号内特殊字符$name保持原有属性
单引号内为文本
可用转义字符\将enter,空格变成一般字符
查看变量内容echo $name
环境变量的功能
随机数生成器$RANDOM,变量范围0~32767
declare -i $RANDOM*10/32767[-i就是整数值]
使用env观察系统环境变量
Set观察所有变量[系统和自定义变量],轻易不要单独使用,会打印出很长的数据,可以配合grep筛选
自定义变量只能在一个shell进程里面使用
除非export[将自定义变量转为环境变量]
测试:bash打开新的线程
//上图打错了,但结果不影响
$PS1:
命令提示符
\d显示日期,格式[星期 月 日]
\H完整主机名
\h省略主机名
\t显示时间
\u用户账号
\w完整的工作目录
\W利用basename函数取得工作目录
\#执行的第几个命令
//basename /etc/hello/test 获取路径的文件名
\$提示字符,root就是\#
设置PS1
$PS1=’[\u@\H\w\t]\$’
查看进程PID echo $$或者ps
将环境变量转为自定义变量declare +x name
//由此可以想象declare -x name 把name加入全局变量
//declare单独不要使用,和set一样会打印出很多........
标记通过环境导出到后续命令的名称,使用+而不是-关闭属性,
查看上一个命令的返回值
echo $? 成功执行命令返回0
//出了个小问题,之前打开vim不小心使用了ctrl+z,以为是关闭进程,实际是挂在后台了
//导致无法退出logout
//解决办法
//jobs -l 命令列出所有进程
//fg %n[n为进程号1,2之类]在前台运行 bg同,后台运行
//kill %n或者kill PID
查看语系
locale -a查看所有支持语系编码
变量键盘读取,数组与声明:read,array,declare
read variable适用于脚本里面使用
declare 声明变量的类型
declare -i var 将变量声明为整数[integer]
declare -a var 声明为数组
declare -r var将变量设置为只读属性,不可更改
只读属性只能注销才能恢复
declare -p列出变量属性
变量内容的删除,取代,替换
${var#/*:}
删除变量开始最短的#,/开始标志,:结束的标志,*通配符
#替换文字最短一个
##替换文字最长一个
#和##都是从前面开始删除
%和%%是从后面开始删除
开始标志:,结束标志bin
Bash shell的操作环境
路径与命令查找顺序
- 以相对或绝对的路径执行命令,例如/bin/ls或者./ls
- 由alias找到命令
- 由bash内置的builtin命令执行
- 通过$PATH变量查找执行
举例:echo 为一个bash内置命令
alias echo=’echo hello’[只能单引号使用,双引号具有保持变量原有属性的设置]
bash的登陆与欢迎信息:/etc/issure,/etc/motd
\d显示本地端日期
\l[小写L]显示第几个终端界面
\m显示硬件等级
\n主机网络名称
\r操作系统版本
\t本地端时间
\S操作系统的名称
\v操作系统版本
\d和\t,\l效果
bash的环境配置
前几节的命令别名,自定义变量,一旦注销都会消失,要想保留设置,就要将这些设置写入配置文件
login shell需要输入用户及账号密码登录
non-login shell 在X-window上面直接召唤terminal或者在一个终端下面bash命令进入
这两个取得bash的情况,读取的配置文件并不一样
/etc/profile
只有login shell读取,每个用户登录取得bash必读取的配置文件,想要调整所有用户环境使用这个,不过没事不要随便改变这个文件
~/.bash_profile
~/.bash_profile
~/.bash_login
~/.profile
上面三个文件只读取一个,如果不存在才会读下一个
只有login shell读取
实际读取的是~/.bashrc文件
non-login shell,仅读取~/.bashrc
source 命令
读入环境配置文件
在.bashrc文件里修改添加别名测试
注:source和.功能一样
echo无法打印出别名
终端快捷命令查看stty -a
Ctrl+Q
Ctrl+S
数据流重定向
1>覆盖方法,正确数据写入
1>>累加方法,正确数据写入
2>覆盖方法,错误数据写入
2>>累加方法,错误数据写入
若只有>>,>,默认是1
双向重定向tee
数据一份送往文件,一份发送到屏幕
echo $PATH|tee 1.txt|cut -d “:” -f 1
命令执行
cmd1;cmd2 先执行cmd1,再执行cmd2
cmd1&&cmd2若cmd1执行完毕,且正确执行[$?=0],则执行cmd2
若cmd1执行完毕错误,则不执行cmd2
cmd1||cmd2若cmd1执行完毕,且正确执行[$?=0],则不执行cmd2
若cmd1执行完毕错误,则执行cmd2
管道命令
管道命令|仅能处理上一个命令传来的正确信息,对于错误信息无处理能力
选取命令cut,grep
将一段数据分析后,取出我们想要的
cut -d “分割字符” -f num
-d,-f一般配合使用,num代表取出第几段
grep[常用]
-c计算找到匹配字符次数
-i忽略大小写
-n顺便输出行号
-v反向选择[没有关键词的行]
--color=auto关键词部分加上颜色
排序命令sort,wc,uniq
wc计算输出数据的行数,字数,字符数
字符转换命令tr,col,join,paste,expand
tr
用来删除一段信息中的文字或者是进行文字信息替换,
tr [-ds] set1....
-d 删除信息中的set1字符
-s替换重复字符
|tr “[a-z]” “[A-Z]”转为大写
col用来处理将tab键转为空白
-x将tab键转为空白
感觉用没用作用不太大........
Join
用来处理两个文件之间的数据,主要用在处理两个文件当中,有相同数据的那一行,才将他们加在一起
//join不太好用....................
paste
paste [-d接分隔符默认tab] file1 file2
expand
将tab转为空格
划分命令split
文件太大,使用split将文件分割
-b num[num为分割的大小,可以接单位b,k,m],默认以字节单位
-l用行数来进行划分//split有问题