07_bash
说明:
本博客主要包含bash的基础知识(2017-02-28,2017-03-03)
一.认识bash
shell提供用户操作系统的接口
/etc/shells 查看shell
/etc/passwd 记录登录的shell
type [-tpa] name 显示外部命令还是bash内置命令(主要找的是执行文件)
-t: file 外部命令
alias 别名 type -t ls
builtin 内置命令 type -t cd
-p:name为外部命令时,显示完整文件名
-a:将PATH变量定义的路径中,将含有name命令都列出来,包含alias
type ls type -t ls type -a ls
二.shell的变量
1.变量显示与设置 echo,unset
(1)显示(变量加$)
echo $variable echo $PATH echo ${PATH}
(2)设置 =
myname=abc 不能有空白 echo $myname
(3)双引号保持特殊字符原本特性,单引号显示特殊字符的纯文本
myname=abc var="lang is $myname" echo $var #lang is abc var2='lang is $myname' echo $var2 #lang is $myname
(4)还需要其他命令提供的信息 $(),``之内的命令会先被执行,将执行出来的结果作为外部的输入信息
version=$(uname -r) echo $version #4.4.0-62-generic
(5)增加变量内容 $变量名称 累加内容 or ${变量名称} 累加内容
PATH=$PATH:/home/bin #增加变量内容 name="$name"\ is\ great #\转义字符,转义空格 name=${name}\ great
unset name #取消变量
(6)export 环境变量
export PATH
bash 进入子进程
exit 退出子进程
(7)大写字母为系统默认变量
(8)unset myname 取消变量
2.环境变量
env 查看环境变量
set 查看所有变量
RANDOM变量
declear -i number=$RANDOM*10/32768; echo $number #随机取出0-9的随机数
PS1(提示符设置):
\d:星期月日格式显示日期
\H:完整主机名
\h:主机名第一个小数点前的名字
\t:显示时间 24h "HH:MM:SS"
\T:12小时制
\A:显示时间,24 "HH:MM"
\@:12 am/pm
\u:当前用户名
\v:bash版本
\w:完整工作目录
\#:执行第几个命令
\$:root# 其他$
PS1='[\u@\h \w \A]\$'
echo $$ #目前shell的线程代号
echo $? #上一个执行命令的回传码
$:目前shell的线程代号 echo $$
?:上一个执行命令的回传码 echo $? 成功返回0
export:显示所有环境变量
declare:将环境变量转成自定义变量
3.语系变量 locale
locale -a #支持语系
locale #查看语系变量
4.变量键盘读取,数组与声明:read,array,declare
read [-pt] variable 读取键盘
-p:接提示符
-t:等待秒数
read atest #键盘输入内容 echo $atest read -p "please enter your name:" -t 30 named #等待30s echo $named
declare/typeset 声明变量类型
declare [-aixr] variable
-a:将变量定义为数组类型
-i:整数
-x:将变量设置为环境变量
-r:设置为只读不可更改与重设
+:-变成+取消操作
sum=1+2+2 默认变量为字符串型 echo $sum #1+2+2 declare -i sum=1+2+3 echo $sum #6
array变量类型
var[index]=content
var[1]=1 echo ${var[1]} #不能直接写$var[1]
5.ulimt:与文件系统及程序的限制关系
bash限制用户的某些资源
ulimit -a 列出目前身份的所有限制数据数值
ulimit -f 10240 限制用户仅能创建10M以下的容量的文件
复原ulimit的设置方法:注销后登录
6.变量内容的删除,替代和替换
${变量#关键字} 从左往右删除最少的从头开始的符合关键字的数据
${变量##关键字} 从左到右 最多
${变量%关键字} 右 左 最少
${变量%%关键字} 右 左 最多
MAIL=/var/spool/mail/root echo ${MAIL##/*/} #root echo ${MAIL#/*/} #/spool/mail/root MAIL=var/spool/mail/root/ echo ${MAIL%%/*/} #var echo ${MAIL%/*/} #var/spool/mail/
echo ${path/sbin/bin} 将sbin替换为bin echo ${path//sbin/bin} 将所有符合内容都替换 username=${username -root} username设置过就取设置的值,未设置过取root username=${usernmae:-root} username为空字符串也可设置为root echo $username
三.命令别名与历史命令
1.alias,unalias 设置使得dos linux 通用
alias lm='ls -l | more' alias rm='rm -i' alias unalias lm
2.history:历史命令
history [n]
history [-c]
history [-rwa] histfiles
n:最近n条记录
-c:目前shell中的所有history清除
-a:将新增history命令增加到histiles中,若没有增加histfiles则默认写入~/.bash_history
-r:读取hostile内容到history记忆中
-w:将目前history记忆内容写入histfile文件中
hisotry 3
!3:执行第3条命令
!command:由最近的命令向前搜寻命令串开头为command的命令并执行
!!:执行上一个命令
同时开启多个bash,则保存的时最后关闭的那个
四.Bash shell的操作环境
1.路径与命令查找顺序
(1)绝对路径或相对路径 /bin/ls ./ls
(2)alias
(3)bash内置
(4)PATH变量
2.登录与欢迎信息:/etc/issue
登录与欢迎:/etc/issue
远程登录:/etc/issue.net
3.bash的环境配置文件
login shell:
/etc/profile 系统的整体设置
/.bash_profile or /.bash_login or /.profile(ubuntu) 用户个人设置
source(或者.) 配置文件名 读入环境配置文件命令(多环境的切换)
source ~/.bashrc
non-login shell:
~/.bashrc
4.终端的环境设置 stty,set
stty [-a] 查阅目前的按键内容
eof : 结束
erase: 向后删除
intr: 中断
kill: 删除目前命令行的所有文字
start:某进程停止后,重新启动它的输出
stop:停止目前屏幕输出
stty erase ^h [ctrl]+h 进行字符串的删除
set [-uvCHmhBx] 设置整个命令输入输出环境
set $- set所有设置
5.通配符与特殊符号
*:0到无穷多个任意字符
?:一定有一个任意字符
五.数据流重定向
1.重定向
标准输入:0: <(覆盖): <<()
标准输出:1: >(覆盖): >>(累加)
标准错误输出:2: 2>(覆盖): 2>>(累加)
find /home -name .bashrc >list_right 2>list_error
/dev/null 垃圾桶黑洞设备与特殊写法
find /home -name .bashrc 2>/dev/null 错误数据丢弃,屏幕上显示正确的数据 find /home -name .bashrc >list_2>&1 正确和错误的信息写入同一个文件 find /home -name .bashrc &>list 正确和错误的信息写入同一个文件
cat > files 创建文件 [ctrl]+d离开 cat > catfile <~/.bashrc 将.bashrc的内容复制到catfile中去 cat > catfile <<'eof' 输入eof则停止输入 <<结束输入
2.命令执行的简单判断依据: ; && ||
cmd;cmd 一次输入多重命令
sync ; sync; shutdown -h now
$?: 命令回传码
cmd1 && cmd2 : cmd1完毕且正确$?=0,执行cmd2
cmd1完毕为错误$?<>0,不执行cmd2
cmd1 || cmd2 : cmd1完毕且正确$?=0,不执行cmd2
cmd1完毕且错误$?<>0,执行cmd2
一般形式: cmd1 && cmd2 || cmd3
ls /tmp/abc && touch /tmp/abc/hehe
ls /tmp/abc || mkdir /tmp/abc
六.管道命令 |
ls -al /etc | less
管道命令仅处理标准输出,且必须嫩够接受来自前一个命令的数据成为standard input继续处理才行
1.选取命令:cut,grep
cut -d '分隔符' -f fields 用于分隔字符
cut -c 字符范围 用于排列整齐的信息
-f:根据-d分割的数段,用-f取出第几段
-c:移字符的单位取出固定字符区间
echo $PATH | cut -d ':' -f 5 echo $PATH | cut -d ':' -f 3,5 export | cut -c 12- 第12往后的字符 export | cut -c 12-20 12列-20的字符
grep [-acinv] [--color=auto] '查找字符串' filename
-a:将binary文件以text文件的方式查找数据
-c:加算查找的字符串的次数
-i:忽略大小写
-n:顺便输出行号
-v:反向选择
last | grep 'root' last | grep 'root' |cut -d ' ' -f 1
2.排序命令:sort,wc,uniq
sort [-fbMnrtuk] [file or stdin]
-f:忽略大小写
-b:忽略最前面空格部分
-M:以月份名字排序
-n:纯数字排序
-r:反向排序
-u:相同数据仅出现一行代表
-t:分隔符
-k:以那个区间来排序
cat /etc/passwd | sort cat /etc/passwd | sort -t ':' -k 3 以第三个关键字排序 last | cut -d ' ' f 1 |sort
uniq [-ic]
-i:忽略大小写
-c:进行计数
last | cut -d ' ' -f 1 | sort | uniq (-c)
wc [-lwm]
-l:仅列出行
-w:仅列出多少字
-m:多少字符
cat /etc/man.config | wc last | grep [a-zA-Z] | grep -v 'wtmp' | wc -l 输出登录者
3.双向重定向 tee
tee同时将数据流送到文件与屏幕
tee [-a] file
-a:以累加方式,将数据加入file中
last| tee last.last | cut -d ' ' -f 1 保存到last.last文件,同时输出到屏幕
4.字符转换命令:tr,col,join,paste,expand
tr [-ds] set1
-d:删除信息中set1字符串
-s:替换重复的字符
last | tr '[a-z]' '[A-Z]' 将所有小写变成大写 cat /etc/passwd | tr -d ':' 删除冒号
col [-xb]
-x:将tab键转换成对等空格
-b:文字内有\,仅保留\后的那个字符
cat -A /etc/man.config 看到文本中的特殊字符 cat /etc/man.config | col -x | cat -A | more
join [-ti12] file1 file2
-t:默认以空格为分隔符,且对比第一个字段数据,若两个文件第一个字段数据相同,则将两条数据连成一行,且第一字段放在第一个
-i:忽略大小写差异
-1:第一个文件用那个字段分析
-2:第二个文件用那个字段来分析
head -n 3 /etc/passwd /etc/shadow join -t ':' /etc/passwd /etc/shadow join -t ':' -1 4 /etc/passwd -2 3 /etc/group 第一个文件以第四个字段,第二个文件以第三字段组合
paste [-d] file1 file2
-d:接分隔符
-:如果file写成-表示来自stdin的数据
paste /etc/passwd /etc/shadow 同一行中间以tab隔开
expand [-t] file tab转换为空格
-t 接数字,移几个空格来代表tab
grep '^MANPATH' /etc/man.config | head -n 3 | expand -t 6 - | cat -A 以6个空格代替tab
5.切割命令:split
split [-bl] file PREFIX
-b:接欲切割成的文件大小,1k,1b,1m
-l:以行数来进行切割
PREFIX:代表前导符,作为切割文件的前导文字
split -b 300k /etc/termcap termcap 分割 cat termcap* >> termcapback 合成 ls -al / | split -l -10 - lsroot 每10行记录成一个文件 wc -l lsroot*
6.参数带换xargs
7."-"
stdin,stdout用-代替
tar -cvf - /home | tar -xvf -

浙公网安备 33010602011771号