您的位置:首页 > 运维架构 > Shell

Linux学习笔记-bash(鸟哥11章 老段视频笔记)

2017-03-26 20:44 239 查看
11章shell

shell的介绍

shell 对命令进行翻译。转移器。把命令翻译成cpu可以都懂的语言。

打开终端的时候会链接到一个shell中,即链接到shell进程中。

Shell 类型

cat  /etc/shells


直接输入名字可以直接切换

[远程桌面传播的是图片]

查找命令所在的路径

which ls


/bin/ls #ls是在/bin目录下的

type cd
查看命令类型

cd is a shell builtin

cd是shell内置的命令。不能使用which进行查看。可以使用type查看类型

shell 变量

变量基础

声明变量:

本地变量,在子shell无效。

变量名=值
# ‘=’两边不要有空格

环境变量,会影响子shell

export yy=10


declare -x zz=10


变量名:不能以数字开头,由字母、数字、_ 组成

取消变量:

unset 变量名


declare +x zz
环境变量变成本地变量

查看变量

set


env
export
export -p
显示所有的环境变量

输出变量

输出第12个参数:
echo ${12}


特殊的变量

脚本中:

0表示脚本文件名字# 表示参数格个数

$* 表示所有参数

命令行中:

HOME当前用户家目录,登陆时赋值USER 当前用户名

HISTFILESIZEhistory可以保存的命令数PS1 输入命令的前面那个[root@www ~]

PS2还行输入命令的提示符>LANG 默认编码

locale -a
显示系统支持的编码

变量键盘读取,数组与声明

用read从键盘读取,脚本常使用

echo "请输入您的名字"
read name
echo "欢迎您 $name"

read -p "请输入您的名字" name

read
88
echo $REPLY     #输出88


数组array

xx=(aa bb cc dd)

echo ${xx[0]} 输出aa

echo ${xx[@|*]} 查看所有元素

echo ${!xx[@]} 查看下标

echo #{!xx[@]} 查看个数

delare

设置只读的变量

declare -r aa


readonly bb


更好的变量引用方法: echo ${xx}

xx=book
echo '$xx'						直接输出字符串:$xx
echo "$xx"                         输出book
echo "我买了10本${book}s"        输出:我买了10本books


嵌套命令的执行

echo "xxx`hostname`xxx"
echo "xxx${hostname}xxx"


对文件系统及程序的限制关系 ulimit

ulimit -a           #查看所有的大小限制
ulimit -f 20480      #设置创建文件大小限制20M


变量内容的删除、替代和替换

删除\

path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/bin:/usr/local/games"
r=${path#*usr/bin}     #从开头删除,删到第一个usr/bin
echo $r        #输出:/sbin:/bin:/usr/games:/usr/local/games:/usr/bin:/usr/local/games
r=${path##*usr/bin}        #从最后的usr/bin开始删,删到开头
echo $r                    #输出:/usr/local/games
r=${path%bin*}         #从最后一个开始往后删
echo $r                    #输出:前面没变化……/usr/
r=${path%%bin*}            #从第一个bin往后删,
echo $r                    #输出/usr/local/s


替换

删除变量
unset xx


判断变量是否存在:

r=${XX-"AAAA"}
xx存在则将xx赋给r,否则将AAAA赋给r

r=${XX:-"AAAA"}
xx存在且不为空值则将xx赋给r,否则将AAAA赋给r

r=${XX:="AAAA"}
xx存在且不为空值则将xx赋给r,否则将AAAA赋给r和xx

r=${XX:?"AAAA"}
xx存在且不为空值则将xx赋给r,否则将AAAA输出

r=${XX:+"AAAA"}
xx存在且不为空值则将AAAA赋给r

alias aa=”ifconfig eth0” 给ifconfig eth0起个简称

unalias aa

快速调用历史命令
!编号


清除历史命令 history -c

操作环境

命令环境

echo 输出自带换行符。

echo -n xxxx
本次输出舍弃换行符

alias echo='echo -n'
以后的echo调用都没有换行符

!echo是命令。,也是一个别名,到底执行的哪一个呢?

可以通过
type -a echo
进行查看,优先顺序从上到下

echo is aliased to `echo -n’

echo is a shell builtin

echo is /bin/echo

登陆前后信息

登陆前信息

vim /etc/issue


【-d 指明当前日期】

登陆后信息

vim /etc/motd


通过talnet登陆的提示信息

vim /etc/issue.net


bash环境配置文件

login-shell和no-login-shell

login-shell

登陆时候使用的shell

会执行以下脚本

/etc/profile 环境中的所有全局变量

/etc/profile.d 别名的设置

/etc/inputrc 快捷键设置

进入用户家目录 ~ 时候会执行 ~/.bash_profile

只对当前用户有效



no-login-shell 不需要输入密码登陆的shell

终端机环境设置

stty快捷键设置

set

set -u
开启检查变量是否被定义。

set +u
关闭检查变量存在

set +x
跟踪所有的操作

set -x
提供更新功能

通配符

E.g. 找出文件名符合的文件:字母,数字,都可,非数字

ls [a-z][1-9]?[!0-9]*.mp3


[]一对中括号匹配一个字符

[a-z] 匹配26个小写英文字母。

[a\-z]匹配 a,,z

数据流重定向

输出重定向.所有的输出默认是输出在屏幕上。修改保存地址

> 将输出放到文件中, 覆盖(只能重定向错误的结果)

>> 追加(只能重定向正确的结果)

2> 错误结果去覆盖

2>> 追加错误结果

&> 正确错误全都重定向

cal 2> hosts 1>&2
正确的像错误的一样进行导入

xxx cal>hosts 2>&1
错误的像正确的一样进行导入

输入重定向<

tr 'a-z' 'A-Z' < hosts


here文件中<< 设置输入结束字符。

可以任意写文档,一直到输入<< 右侧的符号结束

here可以识别变量



命令执行判断依据

分号; 顺序执行命令

$? 记录命令正确(0)还是错误(非0)。

&& 与

|| 或



管道pipe

命令1 | 命令2 |命令3 将命令1执行结果最为命令2的执行参数

ifconfig eth0 | tee xx |grep 'inet addr'


将ifconfig eth0的输出结果传给命令tee,结果保存到xx中,并将这个结果当成grep的输入

tee xx保存结果只保存最后一次,想要继续追加:

ifconfig eth0 | tee -a xx |grep 'inet addr'


选取命令

cut -d: -f 1 文件名


-d 指明分隔符:

-f 指明查看部分

grep 过滤

grep 选项 关键字 filename


grep -i tom passwd


-i 忽略大小写

-n加行号

-v反向过滤,输出不含有关键字的行

-A3过滤关键字那一行,并过滤下面的3行

-a3过滤关键字那一行,并过滤上面的3行

排序命令

sort

sort -n -r


​ -n按照数字形式排序,默认从小到大

​ -r从大到小排序

sort -t: -k3 passwd
-t指明分隔符,-k指明第几部分passwd的第三部分进行排序

sort -t -n: -k3 passwd
-n以数字形式排序

sort -u
-u去重

uniq

uniq
去重排序,相当于sort -u

uniq -c
统计重复出现的次数

wc字符统计

输出:行号 单词数 字符数

wc -l xx 行号

wc -w xx 单词数

wc -c xx 字符数

统计一个文件夹有多少个目录

ls -l / | wc -l




字符转换

字符转换tr

tr 'a-z' 'A-Z' < hosts


​转换之后覆盖原文件:

tr 'a-z' 'A-Z' < hosts > xxx
mv xxx hosts


错误做法:
tr 'a-z' 'A-Z' < hosts > hosts


这两个命令等同
tr 'a-z' 'A-Z' < host
cat hosts | tr 'a-z' 'A-Z'


​ 删除tr -d

cat passwd | tr -d ':'
输出删除:的passwd

字符转换col,expand



tail -7 /etc/man.config | cat -A
把符号显示出来

^I 表示tab键 $表示一行结束

tail -7 /etc/man.config | col -x
把tab转成空格

tail -7 /etc/man.config | expand


粘贴命令jion和paste

paste aa bb 将aa 和 bb 文件粘贴在一起

join 默认是空格作为分割符

aa bb

a123 a345

b123 b289

c123 a114

join -t ":" aa bb
-t指明分隔符

a123:345

b123:289

join -t ":" -1 1 aa -2 3 bb
第1个文件的第一部分和第2个文件的第3部分join

a123:114

分割文件 split

按块分割

split -b 10k /etc/services xxx
把/etc/services文件分成每份10k,以xxx开头命名

cat xxx* >services
将文件重新组成service

按行分配文件

split -l 100 /etc/services xxx
100行分配成一个文件

参数代换xargs

常和find结合

find -name 'file*'
查找以file开头的文件

find -name 'file*' | xargs ls -l
显示以file开头的文件的文件信息

-减号作用

tar cvf home.tar /home | tar xvf
压缩生成home.tar并解压

tar cvf - /home | tar xvf -
不生成home.tar压缩文件直接解压

补充

echo $$ 进入子shell

\是回车

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux