shell 学习笔记
多命令符
符号 | 格式 | 说明 |
; | 命令1;命令2 | 命令1和命令2都会执行 |
&& | 命令1&&命令2 | 逻辑与 |
|| | 命令1||命令2 | 逻辑或 |
通配符
通配符 | 作用 |
? | 匹配一个任意字符 |
* | 匹任何内容 |
[] | 匹配括号中的任意一个字符 |
[-] | - 代表范围 [a-z] ,匹配a-z中的任意一个字符 |
[^] | 逻辑或, 匹配非括号中的一个字符, [^0-9] 匹配一个非数字的字符 |
其他特殊符号
符号 | 作用 |
'' | 表示 '' 中的所有特殊符号 没有特殊意义 如:$ \ |
"" | $ ` \ 有特殊含义 |
`` | 调用系统命令 |
$() | 调用系统命令 |
# | #开头注释 |
$ | 调用变量 如: $name |
\ | 转义符 |
变量分类
用户自定义变量
环境变量 :系统操作环境相关的变量
设置环境变量 : export 变量名=变量值
查询变量 : env
删除变量 : unset 变量名
位置参数变量:主要是用来向脚本当中传递参数或数据的,变量名不能自定义
如:$n:n为数字 $0代表命令本身,$1-$9代表第一到第9个参数,十以上要用大括号包含 ${10},如同java中的变量替换
test.sh
-----------------
#!/bin/bash
$0
$1
-----------------
执行 ./test.sh 123
则 : $0:./test.sh 为命令本身,$1:123
$*:代表命令行中所有参数,$*把所有参数看做一个整体
$@:代表命令行中的所有的参数,$@把每个参数区分对待
$#:代表命令行中所有参数的个数
预定义变量:是bash中已经定义好的变量
------------------------------------------
预定义变量 | 作用
------------------------------------------
$? | 最后一次执行的命令的返回状态,若这个变量的值为0,证明上个命令正确执行,更像是错误码
-------------------------------------------
$$ | 当前进程的进程号(PID),像tomcat每次启动都可以保存进程号,然后执行停止脚本,找到这个进程号就可以关闭
-------------------------------------------
$! | 后台运行的最后一个进程的进程号
--------------------------------------------
set 查看所有 变量
特殊复制命令 dd
dd if=输入文件 of=输出文件 bs=字节 count=个数
if //in file
of //out file
bs //binary stream,一次拷贝多少个字节
count //一共拷贝多少次
后台执行 &
示例 : ./test.sh &
接收键盘输入
read [选项] [变量名]
-p "提示信息" //就想输入密码 给的提示
-t 秒数 //等待时间
-n 字符数 //接收指定的字符数
-s // 隐藏输入的数据, 就像密码 ****** 这样,但是linux中 直接为 不显示
数值运算
声明变量类型
declare [+/-][选项] 变量名
-: 给变量设定类型属性
+: 取消变量的类型属性
-i: 将变量声明为整数型(integer)
-x:将变量声明为环境变量
-p: 显示指定变量的被声明的类型
示例: aa=11
bb=22
declare -i cc=$aa+$bb
echo cc
expr或let 数值运算工具
dd=$(expr $aa + $bb) //把 $aa + $bb 的结果赋值给dd
$((运算式)) 或 $[运算式]
ff=$(($aa+$bb))
gg=$[$aa+$bb]
### 运算 和 java 一样 ,支持 逻辑与 逻辑或等
环境变量
source 配置文件 或者 .配置文件 //使修改的配置文件 直接生效
--------------- ------------------- ------------ -------------- ------------
| /etc/profile | -----> |~/.bash_profile | -----> | ~/.bashrc | -----> | /etc/bashrc | -----> | 命令提示符 |
--------------- ------------------- ------------ -------------- -------------
| |
| ---------------------- |
| ---> | /etc/profile.d/*.sh | <------------------------------------------|
----------------------
|
\|/
------------------------ ---------------------
|/etc/profile.d/lang.sh | ---> |/etc/syscconfig/i18n|
------------------------- ---------------------
Shell登录信息
本地终端欢迎信息 /etc/issue
转义符 | 作用 |
\d | 当前系统日期 |
\s | 操作系统名称 |
\l | 登录的终端号 |
\m | 硬件体系结构 如i386、i686 |
\n | 显示主机名 |
\o | 显示域名 |
\r | 显示内核版本 |
\t | 显示当系统时间 |
\u | 显示当前登录用户的序列号 |
远程终端欢迎信息 /etc/issue.net
转义符不能使用(无效)
由ssh的配置文件/etc/ssh/sshd_config决定是否显示issue.net配置的欢迎信息
登录后的欢迎信息 /etc/motd
之前2个位登录前的信息 ,这个配置为登录成功之后的欢迎信息
正则表达式
* . ^ $ [] [^] \ \{n\} \{n,\} \{n,m\}
##自己体会
字符截取命令
cut [选项] 文件名
-f 列号 //提取第几列
-d 分隔符 //按照指定分隔符分割列
示例: cut -f 2,4 test.txt 提取test文件中的第二和第四列
## 文件要像表格一样,默认使用制表符分出每一列 使用 -d 指定 分隔符
printf '选项' 输出内容
%ns //输出字符串, n是数字指待输出几个字符
%ni //输出整数 n是数字指待输出几个数字
%m.nf //输出浮点数 m和n是数字 如:%8.2f ,则输出8位 6位整数,2位小数
awk '条件1{动作1} 条件二{动作二} ...' 文件名
条件:
BEGIN //先执行这个条件对应的动作
END
$6 >10 //第6列的数据大于10
动作:
格式输出
流程控制语句
{FS=":"} //以 :作为分隔符
### awk '{printf $2 "\t" $6}' test.txt
sed命令 针对的是每一行
sed是一种几乎包括在所有unix平台的轻量级流编辑器,用来将数据进行选取、替换、删除、更新的命令
sed [选项] '[动作]' 文件名
选项:
-n: 一般sed会把所有数据输出到屏幕。-n只会把经过sed命令处理的行输出
-e: 允许对输入数据应用多条sed命令编辑
-i: 用sed的修改结果 直接修改读取数据的文件, 而不是由屏幕输出
动作:
a\: 追加,添加多行时,除最后一行外, 每行末尾 需要使用 \
c\: 行替换 c后面的字符串,替换元数据行,除最后一行外,每行末尾 需要使用 \
i\: 出入 当前行前插入一行或多行。除最后一行外,每行末尾需要使用 \
d: 删除指定的行
p: 打印指定的行
s: 字符串替换, 用一个字符串替换另外一个字符串, 格式为"行范围s/旧字符串/新字符串/g"
## sed -n '2p' test.txt //只输出第二行
sed '2,4d' test.txt //删除2-4行 文件里的内容不会被删除
sed '2c 替换内容\' test.txt //替换第二行内容
sed '3s/70/80/g' test.txt //把第三行70 替换为80 (源文件内容不会替换)
sed -i '3s/70/80/g' test.txt //源文件中的内容 会被替换
sed -e 's/70/80/g; s/zhangsan//g test.txt //70替换为80, zhangsan 替换为空字符串
排序命令 sort
sort [选项] 文件名
选项
-f //忽略大小写
-n //以数值型进行排序。默认是字符串型排序
-f //反向排序
-t //指定分隔符, 默认分隔是制表符
-k n[,m] //按照指定的字段范围排序,从第n字段开始,[,m]字段结束(默认到行尾)例如 -k 3,5
-r //排序取反 z-a这样排序
## sort -n -t ":" -k 3,3 /etc/passwd //使用:分割 ,只用第三个字段,以数值型排序
统计命令 wc
wc [选项] 文件名
-l 统计行数 line
-w 统计单词数 word
-m 统计字符数
条件判断
特殊文件判断 test
-b 文件 | 判断文件是否存在,且是否为块设备文件
-c 文件 | 判断文件是否存在,且是否为字符设备文件
-L 文件 | 判断文件是否存在,且是否为符号链接文件
-S 文件 | 判断文件是否存在,且是否为套接字文件
-d 文件 | 判断文件是否存在,且是否为目录文件
-e 文件 | 判断文件是否存在,
-f 文件 | 判断文件是否存在,且文件为普通文本
-p 文件 | 判断文件是否存在,且是否为管道文件
-s 文件 | 判断文件是否存在,且是否非空
-z 文件 | 判断文件是否存在,且是否为空
-r 文件 | 读权限 -w 写权限 -x 执行权限
## test -e /root/install.log
## [-e /rooot/install.log]
## 两种方式都可以, 需要使用$? 返回上一次执行的命令结果
## [-d /root] && echo "yes" || echo "no"
两个文件之间比较
文件1 -nt 文件二 // 比较 文件1 比 文件二 新 (new)(按修改时间比较)
[-z "aa" -a 1>2 ] && echo "yes" || echo "no" // -a : and
流程控制
if 语句
-------------------------
if [ 条件判断式 ];then
程序
fi
-------------------------
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
不成立时的程序
fi
---------------------------
## [ 条件判断式 ] 有2个空格
case 语句
----------------------------------
case $变量名 in
"值1")
执行1
;;
"值2:)
执行2
;;
*)
其他
;;
esac
---------------------------------------
for循环
-----------------------------------------
for 变量 in 值1 值2 值3 ...
do
程序
done
-----------------------------------------
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
while 循环
-----------------------
while [条件判断式]
do
程序
done
------------------------
until //条件不成立循环 ,直到条件成立
------------------------------
until [条件判断式]
do
程序
done
-------------------------------