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赋给rr=${XX:-"AAAA"}
xx存在且不为空值则将xx赋给r,否则将AAAA赋给rr=${XX:="AAAA"}
xx存在且不为空值则将xx赋给r,否则将AAAA赋给r和xxr=${XX:?"AAAA"}
xx存在且不为空值则将xx赋给r,否则将AAAA输出r=${XX:+"AAAA"}
xx存在且不为空值则将AAAA赋给ralias 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 -uuniq -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 a114join -t ":" aa bb
-t指明分隔符a123:345
b123:289join -t ":" -1 1 aa -2 3 bb
第1个文件的第一部分和第2个文件的第3部分joina123: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
\是回车