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 -

 

posted @ 2017-03-03 13:28  为你千千万万遍  阅读(170)  评论(0)    收藏  举报