shell初级
unset
unset命令从当前shell中删除函数或变量
- 删除变量时,使用-v选项(没有任何选项的情况下,默认此选项),删除函数时,使用-f选项
#!bin/bash
var=123
echo $var #123
unset var #null
hello() #定义函数
{
echo "hello world!"
}
unset -f hello #删除函数
常用环境变量名
变量名 | 描述 |
---|---|
HOME | 用户专属目录 |
PATH | 外部命令的搜索路径 |
HISTSIZE | 保存历史命令记录 |
HOSTNAME | 主机名称 |
SHELL | 当前用户使用的shell类型 |
LOGNAME | 当前用户的登录名 |
shell脚本参数
- $#代表传入函数的参数个数
- $@代表所有参数内容
testfunc ()
{
echo "$# parameters" # $#代表传入函数的参数个数,而$@代表所有参数内容
echo "$@"
}
testfunc a b c
tesssfunc a "b c" a为一个参数,b c为一个参数
####输出
>3 parameters
>a b c
>2 parameters
>a b c
引用参数 | 描述 |
---|---|
0,1,2… | 位置参数 |
* | 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,此选项参数可超过9个 |
@ | 从参数1开始,显示所有向脚本传递的参数 |
# | 参数数量(不包括参数0) |
$ | 脚本运行的当前进程ID号 |
! | 后台运行的最后一个进程的ID号 |
? | 显示最后命令退出状态 |
例子:ps.sh
#!/bin/bash
#记得使用chmod +x ps.sh给其执行权限
ps -eLf |grep $1
IO重定向
管道与重定向
Command>file将command的标准输出重定向到文件中,而不是打印在控制台
1.以>改变标准输出
- command > 文件路径 #写入文件
echo "redirect to file" > /DATACENTER1/yuhang.tang/shell_test/a.txt #打印到了a.txt中
cat /DATACENTER1/yuhang.tang/shell_test/a.txt
2.以<改变标准输入>
command <file 将command的标准输入修改为file
cat </DATACENTER1/yuhang.tang/shell_test/a.txt> /DATACENTER1/yuhang.tang/shell_test/b.txts
#这条命令将复制啊a.txt到b.txt下,输出重定向,从a.txt读入,输出到b.txt
#如果没有b.txt 会自动创建,已有则会覆盖,原来数据丢失
3.以>>追加文件
command>>file 可将command的输出追加到文件file末尾
#依次读取啊a.txt文件的每一行
for line in /DATACENTER1/yuhang.tang/shell_test/a.txt
do
echo $line >> /DATACENTER1/yuhang.tang/shell_test/b.txt #把每一行追加到b.txt中
done
head:显示一个文件或多个文件的前几行或前几个字节(默认显示前10行)
函数
-
位置参数是函数私有的
-
局部变量local ,不会影响函数外同名变量
if/else语句
if condition
then
statements
[elif condition
then statements...]
[else
statements]
fi
逻辑操作
- 与 &&
- 或 ||
- 非 !
NOTE:用中括号做判断时,"[“和”]"前的空格是必须的
if test "2>3"
then
.....
fi
///////////////////////
if test [ 2>3 ] #注意空格
then
.....
fi
for循环
语法:
for name [in list] #遍历list中所有对象
do
...
done
、、、、、、、、、、、、、、、、、、、、、、
for file in 'find . -iname "*.mp3"' #遍历当前目录中的所有MP3文件
do
mpg123 $file #mpg123是命令行程序,播放MP3文件
done
while/until循环
while condition
do
ststement
done
正则表达式
正则表达式是描述某种匹配规则的工具。用一串符号描述共同属性的数据
运算符 | 含义 |
---|---|
\w | 匹配任何单词组成字符, |
\W | 匹配任何非单词组成字符 |
< > | 匹配单词的开头和结尾 |
\b | 匹配单词开头和结尾处所找到空字符串 |
\B | 匹配两个单词祖成字符间的空字符串 |
正则表达式的语法格式
#grep [选项] ‘正则表达式’ 文件列表 -
#前置命令 |grep [选项] ‘正则表达式’
默认输出与表达式匹配的行
- 以行为处理单位
- 对数据按先后顺序逐行处理
- 处理完当前行后,自动处理下一行,直到末行为止
- 默认输出与表达式匹配的行
基本元字符
-
^匹配字符 ——匹配行首
-
匹配字符$ ——匹配行尾
-
. ——匹配任意单个字符。换行符\n 除外
-
——匹配任意次数。(零次到多次)
-
? ——最多匹配一次(0次或1次)
-
+——至少匹配一次(一次或多次)
-
[] ——匹配范围内的任意一个字符
grep ^we /DATACENTER1/yuhang.tang/shell_test/a.txt
>we
>wery
>we
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。 |
---|---|
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 。? 等价于 {0,1}。 |
\d | 匹配一个数字字符。等价于 [0-9]。 |
x|y | 匹配 x 或 y。 |
[xyz] | 字符集合。匹配所包含的任意一个字符,即任何x或y或z的字符集合 |
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、‘l’、‘i’、‘n’。 |
[a-z] | 字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。 |
文本排序
$ sort -d a.txt #排序规则ASCII
1.txt
2
46
86
ihao
nihao
redirect to file
txt
we
we
wery
sort -d -f -u fruits.txt #-d标志忽略特殊字符,-f标志忽略大小写差异,-u告诉sort命令去除选项中的重复行
文本去重
uniq命令删除文件中的重复行
-c 在输出行前加上每行在输入文件中出现的次数
-d 仅显示重复行
-u 仅显示不重复的行
统计文本字数,行数,字符数
wc /etc/psswd #显示了该文件有54行 75个单词以及2477个字符
>>>54 75 2477 /etc/passwd
-c 参数含义是让wc命令显示字符的个数
-w 参数显示单词的个数
-l 参数显示文件文本行的行数
打印和格式化输出
- 使用pr打印文件:这个工具的一个基本用途就是将较大的文件分割成多个页面,并为每个页面
- 使用fmt编排文本文件
- 使用fold限制文本宽度