linux早期学习笔记,比较乱,如果有需要用到再做整理
文件权限解读:
-rwxr-xr-x 第一个-表示一个文件,目录则为d
r代表读权限,用数字表示是 4 即等于1*2^2
w代表写权限,用数字表示是 2 即等于1*2^1
x代表执行权限,用数字表示是 1 即等于1*2^0
-代表无权限,用数字表示是 0 即等于0*2^[0-2]
快捷键:
ctrl+a :跳到命令行首
ctrl+e :跳到命令行尾
ctrl+u :删除光标至命令行首的内容
ctrl+k :删除光标至命令行尾的内容
ctrl+l :清屏=clear命令
ctrl+c : ( kill foreground process ) 终止,中断{运行时中断|敲错代码时取消运行并换行}, 发送 SIGINT 信号给前台进程组中的所有进程,强制终止程序的执行
ctrl-z: ( suspend foreground process ) 发送 SIGTSTP信号给前台进程组中的所有进程,常用于挂起一个进程,而并非结束进程,
用户可以使用使用fg/bg操作恢复执行前台或后台的进程。fg命令在前台恢复执行被挂起的进程,此时可以使用ctrl-z再次挂起该进程,
bg命令在后台恢复执行被挂起的进程,而此时将无法使用ctrl-z再次挂起该进程
ctrl-d: (Terminate input, or exit shell)一个特殊的二进制值,表示EOF,作用相当于在终端中输入exit后回车
命令:
cp copy file
-v --verbose 显示命令执行的操作
-u, --update 使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件,相当于更新
-f, --force
-r, -R, --recursive 递归复制目录及其子目录内的所有内容
cp -r dir1 dir2 复制dir1的所有内容到dir2,dir2不存在时将会自动创建
-p 大写P,等于--preserve=模式,保留文件属性,所有权,时间戳
ping 确定网络和各外部主机的状态;跟踪和隔离硬件和软件问题;测试、评估和管理网络
inux下的ping和windows下的ping稍有区别,linux下ping不会自动终止,需要按ctrl+c终止或者用参数-c指定要求完成的回应次数。
-c number 指定number回应次数后终止
history -d 500 10 :表示删除第500行命令开始的10条命令
history:显示用户敲的命令历史
echo $HISTSIZE:显示history命令缓冲区的大小
touch 将每个文件的访问时间和修改时间改为当前时间,可创建空文件。
-t STAMP 使用[[CC]YY]MMDDhhmm[.ss] 格式的时间而非当前时间
file file 查看文件类型等信息
ps process status 列出系统中此刻运行的程序,当前进程的快照。
-u user 指定用户
-a 显示同一终端下的所有程序
-A 显示所有进程
-f 显示程序之间的关系
-e 显示环境变量
ps -ef 显示所有进程信息,包括命令
ps -l 显示此次登陆的pid与相关信息
df 查看系统磁盘空间使用情况,包括大小、磁盘块和inode的使用情况
-h human readable format
-i inodes数
-P 一个内容放在同一行中显示,不换行
du 查看文件或者目录的大小
-h human readable format
-s display total file size, 不使用s参数时显示每个子目录下的文件的大小。
free 显示内存情况
-g 以单位为GB显示
-m 以单位为MB显示
history命令历史使用技巧:
!n: 执行第n条历史的命令
!-n:执行倒数第n条命令
!!:执行上一条命令
!string:执行命令历史中最近一个以指定字符串开头的命令
!$(esc .或者alt+.):引用上一个命令的最后一个参数
命令和路径补全:Tab键:敲一次自动补全,敲两次显示补全候选项
ls :list 列出目录或文件等。使用man ls或ls --hlep获取更多的参数用法
-a: 列出目录下的所有文件,包括以.开头的隐含文件
-S: 按文件大小排序
ls -lS
-l: 列出文件的详细信息
-h: human readable
ls -lh
-R: 列出所有子母目录下的文件
-r: f对目录反向排序。
-t: 以时间排序
ls -lt 以修改时间排序,最近修改的在上面
ls -ltr ............,...........下面
-d: 显示当前目录的信息
ls -ld
cd :change directory 切换目录
~: home directory cd 和 cd ~ 都是返回用户主目录
.: 当前目录
..: 当前目录的上一层目录
cd ../.. 返回上两级目录
- :返回进入此目录之前所在的目录
cd !$ : 把上个命令的参数作为cd参数使用
pwd :print work directory 打印当前工作目录
mv :move 移动文件或重命名文件
-f, --force 覆盖前不询问
-i, --interactive 覆盖前询问
-n, –nechoo-clobber 不覆盖已存在文件,如果指定了-i、-f、-n 中的多个,仅最后一个生效
-u, --update 只在源文件文件比目标文件新,或目标文件不存在时才进行移动
-v, --verbose 详细显示进行的步骤
rm :remove 移除文件
-f, –force 强制删除。忽略不存在的文件,不提示确认
-i 在删除前需要确认
-r, -R, --recursive 递归删除目录及其内容
-v, –verbose 详细显示进行的步骤
mkdir :make directory 创建目录/文件夹
-p, --parents 需要时创建目标目录的上层目录,但即使这些目录已存在也不当作错误处理
mkdir -p dir1/sub1/sub2 递归创建多个目录
-v, --verbose 每次创建新目录都显示信息
-m, --mode=模式 设置权限模式(类似chmod),而不是rwxrwxrwx 减umask,只能给出数字。
mkdir -pv dir1/{bin,mtc/ba,lib/{jun,hi}} 一个命令创建项目的目录结构
rmdir :remove directory 移除空目录
more或者less查看文档时:
空格键或f向下翻页
将程序放在后台跑:
nohup 命令 &
touch :创建文件
比较特殊的情况:创建一个中间带有空格的文件"a b"
touch `a b`
head :head 用来显示档案的开头至标准输出中。如果指定了多于一个文件,在每一段输出前会给出文件名作为文件头。如果不指定文件,或者文件为"-",则从标准输入读取数据。
-n num 显示文件的前num行内容
-n -num 输出文件除了最后num行的全部内容
-c num 显示文件的前num字节
-c -num 输出文件除了最后num字节的内容
tail (tail) 用来显示档案的结尾(默认为10行)至标准输出中。若指定了多于一个文件,程序会在每段输出的开始添加相应文件名作为头。如果不指定文件或文件为"-" ,则从标准输入读取数据。
与head用法相同,-num 改为 +num
less 对文件或其它输出进行分页显示,与moe命令相似,但是比more命令要强大许多,可同时浏览多个文件,linux正统查看文件内容的工具。
/pattern * Search forward for (N-th) matching line. 使用一个模式进行搜索,并定位到下一个匹配的文本
输入斜杠 /模式字符串 回车进行查找,n和N控制向上和向下查找
more 可查看文件内容,满屏后停下来按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能(与 vi 相似),使用中按h可以查看说明文件 。
输入斜杠 /模式字符串 回车进行查找,n和N控制向上和向下查找
nl : Number of Lines, 可查看文件内容并输出行号
su :swich user
sudo :super user do
bc :计算器,使用scale=2,指定小数后两位精度。
date : 显示日期,从1970年1月1日开始计算。
nano : 编辑和创建文件
gedit file 可在图形界面和Windows类似的编辑器下编辑文件
uname -a (Linux查看版本当前操作系统内核信息)
cat file 查看文件
-n --number 对所有行编号,包括空行
-b, --number-nonblank 对非空输出行编号
cat test1.log test2.log >test3.log 合并1和2的文件到3中
cat /proc/cpuinfo (Linux查看cpu相关信息,包括型号、主频、内核信息等)
cat >file 或 cat >file <<EOF 将标准输入的内容定向输出到文件`
tac file 将文件反向列出
zcat 查看压缩包文件的内容,参数与cat命令不同
less 以页查看文件,可向上、向下翻页、查找等功能。
zless Like 'less', but operate on the uncompressed contents of any compressed FILEs.
Options are the same as for 'less'.
anaconda命令:anaconda show 文件名 #可以显示该文件(应用)的安装代码
conda info --env:查看已有环境,方便知道qiime的版本以激活qiime
source activate qiime2-2018.4:激活qiime的工作环境
gnome-system-monitor:系统监视器
htop:互动的进程查看器
which :命令的作用是在PATH变量指定的路径中搜索某个系统命令的位置并且返回第一个搜索结果。
locate :命令用来查找文件或目录。 locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db 。
locate file
不能使用./ ../等相对路径 省略路径时进行全局搜索
整个locate工作由四部分组成:
/usr/bin/updatedb 主要用来更新数据库,通过crontab自动完成的
/usr/bin/locate 查询文件位置
/etc/updatedb.conf updatedb的配置文件
/var/lib/mlocate/mlocate.db 存放文件信息的文件
搜索的数据库一天更新一次,查找最新的文件需要先手动更新数据库才能查得到。
使用命令updatedb进行更新
wget :下载文件的工具,wget工具体积小但功能完善,它支持断点下载功能,同时支持FTP和HTTP下载方式.
参考:https://www.cnblogs.com/semonxv/p/3816366.html
wget url
-O filename url -0 大写,下载文件重命名
-b url 后台下载 tail -f wget-log 查看下载进度
-c 断点续传,使用wget -c 重新启动下载中断的文件,对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件。
–spider 测试下载链接,定时下载,可以增加–spider参数进行检查。
-i 下载多个文件
首先,保存一份下载链接文件
cat > filelist.txt
url1
url2
url3
url4
接着使用这个文件和参数-i下载
wget -i filelist.txt
–reject 过滤指定格式下载
wget –reject=gif url 下载一个网站,但不希望下载图片,可以使用此命令。
cut:
-d: 指定字段分隔符,默认是空格
-f: 指定要显示的字段
-f 1,3
-f 1-3
sort 文本排序
-n:数值排序
-r: 降序
-t: 字段分隔符
-k: 以哪个字段为关键字进行排序
-u: 排序后相同的行只显示一次
-f: 排序时忽略字符大小写
wc (word count) 文本统计
-l :lines
-w :words
-c :bytes
-L :max line length
bc 计算器
scale=num 可指定num位小数点
quit 退出
echo "scale=2;111/2" | bc 也可使用这种方法来计算,两个不同的语句要用;隔开
bc <<< "scale=2;111/2" 也可
nano file 打开file的编辑窗口,可对文件进行修改
diff file1 file2 命令用来比对两个文本文件,将不同的行列出来
统计文件个数的差异:
ls -l | grep "^-" |wc -l
提取文件名保存在文件夹中:
参考:https://www.cnblogs.com/Aiapple/p/6475265.html
var=/data/shixq/16S_401sample_shanxi_smoking/SXJC_16S_10samples_HAPLOX_18Y/*
echo ${var##*/} >> ./sample_information.txt
passwd --stdin ?
bash支持的的引导:
``:命令替换
"":弱引用,可以实现变量替换
'':强引用,不完成变量替换
文件名通配:
*:
?:
[]:匹配指定范围内的任意单个字符
[abc],[a-m],[0-9],[a-zA-Z],[0-9a-zA-Z]
例:查找以字母开头以数字结尾的文件
[a-zA-Z]*[0-9]
#[:*:]:表示一种集合
[:space:]:空白字符
[:punct:]:标点符号
[:lower:]:小写字母
[:upper:]:大写字母
[:alpha:]:大小写字母
[:digit:]:数字
[:alnum:]:数字和大小写字母
例:查找字母开头字母结尾,中间有空白字符的文件
[[:alpha:]]*[[:space:]]*[[:alpha:]]
#man 7 glob 可以获取以上用法
[^]:匹配指定范围之外的任意单个字符
权限:
r,w,x
文件:
r: 可读,可以使用类似cat等命令查看文件内容;
w: 可写,可以编辑或删除此文件;
x: 可执行,eXacutable,可以在命令提示符下当做命令提交给内核运行。
目录:
r: 可以对此目录执行ls以列出内部所有文件;
w: 可以在此目录创建文件;
x: 可以使用cd切换进此目录,也可以使用ls -l查看内部文件的详细信息
用户管理:
useradd,userdel(删除),usermod(修改),passwd(改密码),chsh,chfn,finger,id(查看账号相关属性),chage(改变用户各种外围属性的命令)
组管理:
groupadd,groupdel,groupmod,gpasswd
权限管理:
chown(改属主),chgrp(改属组),chmod(改权限),umask
chown(只有管理员可以使用此命令)
用法:chown USENAME file,...
-v 显示详细信息
-R 递归处理所有的文件及子文件夹
chown owner:group file 可直接更改属主和属组
-R:修改目录及内部文件的属主(recursive,递归的)
--reference=/somefile file,... 后面指定的文件属主参考somefile文件的属主
chown USERNAME:GRPNAME file,...(同时改属主属组)
或chown USERNAME.GRPNAME file,...(同时改属主属组)
chown :GRPNAME file,...(只改属组)
chgrp使用方法同理
chmod
chmod 744 file
u=user,g=group,o=other,a=all
chmod u=rwx file
chmod g=rw file
chmod o=rx file
chmod g=r,u=r file 等于 chmod go=r file
chmod g=rx,o= file (其他人的类别没有权限可写为空)
去除或者添加权限
chmod u-rw,o+x file
添加用户:
1.which useradd:先查看useradd所在的目录
2.ls -l file/useradd
或是直接用命令替换一步即可:ls -l $(which useradd)也可写成ls -l $`which useradd`
3.useradd和adduser是同一个命令的不同写法,叫法不一样而已
用法: adduser username
给添加的用户添加一个密码(要有管理员权限):passwd username 弹出输入密码的界面输入密码即可添加
tail -l /etc/passwd 可查看新添加的用户名和密码加密的字段(一般为单向加密(MD5或SHA1-定长输出)$salt(随机生成的加密符号)$定长输出字符)
tail -l /etc/group 可查看新加用户所属组
cat /etc/default/useradd :此目录下包含添加用户时没有指定属性时的默认属性,可修改默认属性
添加组:
用法: groupadd groupname
给用户添加登陆问候语
nano .bash_profile
echo "Hello,shixq,Welcome back.It is `date`."
管理及IO重定向
I/O重定向
输出重定向:
> :覆盖正确输出
>> :追加正确输出
set -c:禁止对已存在的文件使用覆盖重定向;
若需要强制覆盖输出某一文件而不改变默认设置,则使用 >|
set +c:关闭禁止
2> :重定向错误输出,覆盖方式
2>> :追加方式重定向错误输出
可叠加> 2> 将正确输出和错误输出都定向输出,或
&>:同时指定错误和正确的输出,覆盖输出。
&> /dev/null 表示执行结果不需要,送到“黑洞”中去,不予显示与储存。
输入重定向:
< :输入重定向
<< :此处生成文档
管道:把前一个命令的输出作为后一个命令的输入
命令1 | 命令2 | 命令3 | ...
如:将命令 echo "hello,world."的输出全部转化为大写字符:
echo "hello,world." | tr 'a-z' 'A-Z'
tee命令既能保存到文件一份又能输出到屏幕一份
如:echo "Hello,world!" | tee /tmp/hello.out
wc命令可现实输出文件行数
wc -l /etc/passwd 输出包含函数 文件名
wc -l /etc/passwd | cut -d' ' -f1 输出值包含行数 其中-d' ' 指定分隔符为空格
grep及正则表达式
! 前面加个!表示取反
种类:grep,egrep,fgrep
grep: global research pattern
根据模式搜索文本,并将符合模式的文本行显示出来。
pattern:文本字符
用法
grep [OPTION]... PATTERN [FILE]...
-i 忽略大小写
--color 匹配字符颜色突出显示
-v 显示没有被匹配的行
-0 只显示被模式匹配的字符串,而不是显示该行
-E 使用扩展正则表达式
-A num 表示目标行其前num行也显示(A-after)
-B num 表示目标行其后num行也显示(B-before)
-C num 表示目标行其前后两行也显示(C-contex)
alias grep='grep --color' :设置默认匹配字符为颜色显示
正则表达式:reguar expression,REGEXP
1. 字符匹配
元字符:
. :匹配任意单个字符
[] : 匹配指定范围内的任意单个字符
[^] : 匹配指定范围外的任意当个字符
字符集合:
[:digit:] :数字
[:lower:] :小写字母
[:upper:] :大写字母
[:punct:] :标点符号
[:space:] :空白字符
[:alpha:] :所有字母
[:alnum:] :所有数字
例如查找file文件以数字结尾的行: grep '[[:digit:]]$' file
2. 次数匹配,贪婪模式(尽可能长的匹配)
* :匹配任意次数,匹配其前面的字符任意次
如a*b 表示b前面可匹配任意次的a(0到正无穷)。
.* :匹配任意长度的任意字符
\? :匹配其前面的字符1次或者0次,即问号前面的字符可有可无。\表示转义字符
\{m,n\} :匹配其前面的字符至少m次,至多n次。m不可省略,最小为0,n可省略,表示正无穷。
\{0,\} :任意次字符
grep 'a.\{1,3\}b' file : 表示ab之间可以出现任意字符1到3次,如amnb.
3. 位置锚定:
^ : 锚定行首,此字符后面的任意内容必须出现在行首。
$ : 锚定行尾,此字符前面的任意内容必须出现在行尾。
^$ : 空白行
如 grep '^$' file | wc -l 可以统计file文件的空白行数
\<或\b(放在头部): 锚定词首,其后面的任意字符必须作为单词首部出现
\>或\b(放在尾部): 锚定词尾,其前面的任意字符必须作为单词尾部出现
\<root\> 表示root这个词,也可表示为\broot\b
4.分组:
\(\)
\(ab\)* : 即ab为一组,*对ab起作用,表示ab可以出现任意次。
\1 : 引用第一个左括号以及与之对应的右括号所包含的所有内容。
\2 :
\3 :
# grep -E pattern file
grep -E 等于 egrep
-E 表示使用扩展正则表达式
basic regexp:基本正则表达式,如以上
extended regexp:扩展正则表达式
扩展正则表达式:
次数匹配(有的不需要加'\',以下列出)
? :一次或0次
+ :匹配其前面的字符至少1次
{m,n}
分组:
():分组
或者
| : or
如grep -E '(C|c)at' file 查找Cat或者cat
bash脚本编程之一 变量、变量类型等
fgrep: fast grep 不支持正则表达式,直接识别
shell编程:
编译器,解释器
编程语言:机器语言,汇编语言,高级语言
高级语言:
静态语言:编译型语言
强类型(变量),变量在使用前必须先声明变量类型,甚至还要初始化
事先转换为可执行格式(转换为机器语言)
c,c++,JAVA,C#
动态语言:解释型语言,On the fly
弱类型,变量不需事先声明变量类型,甚至不区分类型,一般默认为字符串
边解释边执行
PHP,SHELL,Python, Perl
变量:是内存空间
变量类型:事先确定数据的储存格式和长度
变量名称:
1.只能包含字母、数字和下划线,并且不能以数字开头。
2.不应该系统中已有的变量名重名(重名会覆盖原有变量名)。
3.最好做到见名知意。
bash变量类型:
环境变量
bash:
本地变量(局部变量)
位置变量
特殊变量
引用变量:${VARNAME} 花括号有时可省略,在某些情况下不可省略
如:
animal=pig
echo "$animals" 输出为空,这种情况下要加花括号,将变量与所加的字符分开
echo "${animal}s" 输出pigs 此处""为弱引用,双引号内的变量可以替换
echo '${animal}s' 输出${animal}s 此处''为强引用,单引号内的变量不会被替换
本地变量:
VARNAME=VALUE : 作用域为整个bash进程
局部变量:
local VARNAME=VALUE: 作用域当前代码段
环境变量:作用域为当前shell进程及其子进程
表示方法:
export VARNAME=VALUE 或 VARNAME=VALUE export VARNAME (导出变量而非变量值,所以不加$)
"导出"
位置变量:
$1,$2,...
shift [num] num省略时默认为1,表示每次往前移num个位置变量,即执行脚本语句shift 2后,从第三个参数开始计数,即第三个参数变为第一个,踢掉了两个参数。
写脚本时可以引用输入参数的位置,$1表示第一个参数,一次类推。
如命令: ./file.sh /etc/fstab 脚本file.sh中的$1就可以表示/etc/fstab
特殊变量:
$?: 上一个命令的执行状态返回值
0: 正确执行
1-255:错误执行,1,2,127系统预留,其他数字可在编程时自定义
命令 echo $?
$#: 参数的个数
可加在脚本第一句后面的,即第二句,每次执行脚本时会打印参数个数至屏幕
$*: 参数列表
$@: 参数列表
例子:
# 脚本 filetest.sh
#!/bin/bash
#
if [ $# -eq 0 ]
then
echo "You must give at least a ARG! Usage: ./filetest.sh ARG1 [ARG2 ...]"
exit 3
fi
if [ -e $1 ]
then
echo "ok."
else
echo 'no such file.'
fi
# 加执行权限
chmod +x filetest.sh
# 命令
./filetest.sh /etc/fstab
# 显示执行的命令的每一步过程
bash -x ./filetest.sh /etc/fstab
# 不提供参数
./filetest.sh
# 提供错误的文件
./filetest.sh /etc/abc
撤销变量:
unset VARNAME 释放内存
查看当前shell中的所有变量:
set
查看当前shell中的环境变量:
printenv 或 env 或 export
脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序
保存为.sh文件
第一行:shebang: 魔数
#!/bin/bash (bash的位置可用命令 which bash 查看)
#!后面跟可执行程序的路径,如 which python 结果为/bin/python 则python程序第一行要写成 #!/bin/python
#号开头为注释行,不执行
运行方法:
bash file.sh 即可运行
或
chmod +x file 给file文件都加可执行权限
./file.sh 即可运行
bash编程之二 条件判断
变量申明和语句之间最好加一个空白行。
条件测试类型:
整数类型:
整数测试
字符测试
文件测试
条件测试表达式:
[ expression ] 命令测试法
[[ expression]] 关键字测试法
test expression
整数比较:
-eq: equal
-ne: none aqual
-gt: great than
-lt: lower than
-ge: great or equal
-le: lower or equal
文件测试:
-e FILE:测试文件是否存在
-f FILE:测试文件是否为普通文件(linux文件:目录、特殊文件、管道文件、链接文件、haojiezi(没听清)文件)
-d FILE:测试指定路径是否为目录
-x FILE:测试当前用户对指定文件是否有执行权限
-r FILE
-w FILE
如:测试Dsktop文件是否存在
[ -e ./Dsktop ]
命令逻辑关系:
或:||
并联关系
与:&&
串联关系
如:
如果用户user6不存在,就添加用户user6
! id user6 && useradd user6
! 表示取反即否
id user6 || useradd user6
两个命令相当于两个开关,往能点亮灯泡的方向运转。
如果用户不存在,就显示已存在,否则就添加此用户:
! id user1 && adduser user1 || echo "user1 have exist!"
条件判断,控制结构:
1.单分支的if语句
if 判断条件;then
statement1
statement2
...
fi
或者
if 判断条件
then
statement1
statement2
...
fi
exit语句
if 判断条件
then
statement1
statement2
...
exit 0-255 其中0表示正确执行,1-255表示错误执行
fi
2.双分支的if语句
if 判断条件; then
statement1
statement2
...
else
statment3
statment4
...
fi
exit语句
if 判断条件
then
statement1
statement2
...
exit 0-255 其中0表示正确执行,1-255表示错误执行
else
statment3
statment4
...
fi
例子1
新建.sh文件
nano first_bash.sh
# 脚本内容
#!/bin/bash
#
grep "\bbash$" /etc/passwd &> /dev/null
RESULT=$?
if [ $RESULT -eq 0 ]
then
grep "\<bash$" /etc/passwd | wc -l
else
echo "no such user."
fi
例子2
#!/bin/bash
#
grep "\bbash$" /etc/passwd &> /dev/null
RESULT=$?
if [ $RESULT -eq 0 ]
then
USERS=`grep "\<bash$" /etc/passwd | wc -l`
echo "total $USERS users is bash"
else
echo "no such user."
fi
- 多分支的if语句:
if 判断条件1; then
statement1
...
elif 判断条件2; then
statement2
...
elif 判断条件3; then
statement3
...
else
statement4
...
fi
定义脚本退出状态码
exit:退出脚本
exit 0-255
没有定义退出码,最后一条执行命令的退出码即为脚本的退出码。
测试脚本是否有语法错误:
bash -n file.sh 可以查看file.sh脚本是否有语法错误,仅供参考,结果不一定准确。
bash -x file.sh 显示每个单步执行的语句流程,对脚本检查语法比较有帮助。
bash脚本编程之三 条件判断及算数运算
shell中进行算数运算:
let help 查看let命令帮助
A=3
B=4
1.let 算数运算表达式
let C=$A+$B
2.$[算数运算表达式]
C=$[$A+$B]
3.$((算数运算表达式))
C=$(($A+$B))
4.expr 算数表达式,加号前后各一个空格,而且要使用命令引用。
C=`expr $A + $B`
例:给脚本传递两个参数(整数),显示此两者之和,之乘积。
#!/bin/bash
#
if [ $# -lt 2 ]
then
echo 'Usage:cacl.sh ARG1 ARG2'
exit 3
else
echo "和是$[ $1+$2 ],积是[ $1*$2 ]"
## sed命令
sed(流编辑器)
awk(报告文本生成器)
sed基本用法
sed:Stream EDitor
文本编辑器:行编辑器(还有另外一种编辑器,全屏编辑器:vi)
sed:模式空间
默认不编辑原文件,仅对模式空间的数据做处理。
sed [options] 'AddressCommand' file ...
-n: 静默模式,不再默认显示模式空间中的内容
-i: 直接修改原文件
-e SCRIPT -e SCRIPT ...:可以同时执行多个脚本 SCRIPT可以表示'AddressCommand'
-f /PATH/TO/SED_SCRIPT
sed -f /path/to/scripts file
-r: 表示使用扩展正则表达式
Address:
1、StartLine,EndLine
比如1,100
$:最后一行
2、/RegExp/
/^root/
3、/pattern1/,/pattern2/
第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行
4、LineNumber
指定的行
5、StartLine, +N
从startLine开始,向后的N行;
Command:
d: 删除符合条件的行;
p: 显示符合条件的行;
a \string: 在指定的行后面追加新行,内容为string
\n:可以用于换行
i \string: 在指定的行前面添加新行,内容为string
r FILE: 将指定的文件的内容添加至符合条件的行后面
可用于合并文件至特定位置
如:sed '2r /etc/issue' /etc/fstab
表示在/etc/fstab 文件的第2行后面添加 /etc/issue文件
w FILE: 将地址指定的范围内的行另存至指定的文件中;
如:sed '/oot/w /home/shixq/oot.txt' /etc/fstab
表示将/etc/fstab文件里包含oot的行储存在/home/shixq/oot.txt中。
s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串
加修饰符
g: 全局替换
如: sed 's/\//#/g' /etc/fstab 表示将/etc/fstab文件中出现的/全部替换为#
i: 忽略字符大小写
s///:等于 s###, s@@@
\(\), \1, \2 支持引用
l..e: like-->liker
love-->lover
like-->Like
love-->Love
&: 引用模式匹配整个串
## bash脚本编程之无字符串测试及for循环
字符串比较
== 测试是否相等
!= 测试是否不等,不等为真,等为假
等值比较
A=hello
B=hi
判断A与B是否相等
三种方式都可以:
[ "$A == $B" ] 等号两边必须要加空格,否则会被识别为赋值而发生错误
[ "$A = $B" ]
[[ "$A == $B" ]]
echo $? 查看比较结果
循环:
for
while
until
for 变量 in 列表; do
循环体
done
或
for 变量 in 列表
do
循环体
done
遍历完成后退出
如何生成列表:
{1..100} 1到100的整数
`seq [起始数 [步进长度]] 结束数` 如seq 1 3 10
seq 1 100 1到100的整数
变量声明:
declare -i SUM=0
integer
-x export环境变量
写一个脚本:
计算100以内所有能被3整除的正整数的和:
#!/bin/bash
#
declare -i SUM=0
for i in {1..100}; do
let s=$i%3
if [ "s" == 0 ];then
let SUM=$[$SUM+$i]
fi
done
echo "the sum is:$SUM"
let I=$[$I+1]
SUM=$[$SUM+$I]
let SUM+=$I
let I+=1 相当于 let I++
-=
let I-=1 相当于 let I--
*=
/=
%=
# vim编辑器
文本编辑器,字处理器
ASCII
nano, sed
vi: Visual Interface
vim: VI iMproved
全屏编辑器,模式化编辑器
vim模式:
编辑模式(命令模式)
输入模式
末行模式
模式转换:
编辑-->输入:
i: 在当前光标所在字符的前面,转为输入模式;inset
a: 在当前光标所在字符的后面,转为输入模式;append
o: 在当前光标所在行的下方,新建一行,并转为输入模式;
I:在当前光标所在行的行首,转换为输入模式
A:在当前光标所在行的行尾,转换为输入模式
O:在当前光标所在行的上方,新建一行,并转为输入模式;
输入-->编辑:
ESC
编辑-->末行:
:
10d 删除第10行
set nu 显示行号
! ls /etc 可使用末行模式执行命令并显示结果,再敲:则返回
敲错命令可使用ESC键取消返回未输入时的状态。
末行-->编辑:
ESC, ESC
一、打开文件
# vim /path/to/somefile
vim +# :打开文件,并定位于第#行
vim +:打开文件,定位至最后一行
vim +/PATTERN : 打开文件,定位至第一次被PATTERN匹配到的行的行首
默认处于编辑模式
二、关闭文件
1、末行模式关闭文件(以下命令前面的冒号表示末行模式)
:q 退出
:wq 保存并退出
:q! 不保存并退出
:w 保存
:w! 强行保存(管理员才有的权限)
:wq 等于 :x
2、编辑模式下退出
ZZ: 保存并退出
三、移动光标(编辑模式)
1、逐字符移动:
h: 左
l: 右
j: 下
k: 上
#h: 移动#个字符;#表示数字
2、以单词为单位移动
w: 移至下一个单词的词首
e: 跳至当前或下一个单词的词尾
b: 跳至当前或前一个单词的词首
#w: #表示数字
3、行内跳转:
0: 绝对行首
^: 行首的第一个非空白字符
$: 绝对行尾
4、行间跳转
#G:跳转至第#行;
G:最后一行
末行模式下,直接给出行号即可
四、翻屏
Ctrl+f: 向下翻一屏 forward
Ctrl+b: 向上翻一屏 backward
Ctrl+d: 向下翻半屏 downward
Ctrl+u: 向上翻半屏 upward
五、删除单个字符 -编辑模式
x: 删除光标所在处的单个字符
#x: 删除光标所在处及向后的共#个字符
六、删除命令: d
d命令跟跳转命令组合使用;
#dw, #de, #db
dd: 删除当前光标所在行
#dd: 删除包括当前光标所在行在内的#行;
末行模式下:
StartADD,EndADDd 如1,8d 删除第一行到第八行
.: 表示当前行
$: 最后一行
+#: 向下的#行
七、粘贴命令 p
小写 p: 如果删除或复制为整行内容,则粘贴至光标所在行的下方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的后面;
大写 P: 如果删除或复制为整行内容,则粘贴至光标所在行的上方,如果复制或删除的内容为非整行,则粘贴至光标所在字符的前面;
八、复制命令 y yank 简写为y
用法同d命令
九、修改:先删除内容,再转换为输入模式 change
c: 用法同d命令
十、替换:r 单个字符的替换
R: 替换模式 输入都为替换原字符内容 ESC退出替换模式
十一、撤消编辑操作 u undo简写
u:撤消前一次的编辑操作
连续u命令可撤消此前的n次编辑操作 默认只可撤销50次
#u: 直接撤消最近#次编辑操作
撤消最近一次撤消操作:Ctrl+r
十二、重复前一次编辑操作
.
十三、可视化模式
v: 按字符选取
V:按矩形选取 整行整行的选取
十四、查找
/PATTERN 从文件首部向尾部查找
?PATTERN 从文件尾部向首部查找
n
N
十五、查找并替换
在末行模式下使用s命令
ADDR1,ADDR2s@PATTERN@string@gi 如 .,$-1s/he/HE/g 表示从当前行到倒数第二行的he换成大写的
g 全局替换
i 忽略大小写
gi 可同时使用
1,$ 可简写为 %:表示全文
练习:将/etc/yum.repos.d/server.repo文件中的ftp://instructor.example.com/pub替换为http://172.16.0.1/yum
%s/ftp:\/\/instructor\.example\.com\/pub/http:\/\/172.16.0.1\/yum/g
%s@ftp://instructor\.example\.com/pub@http://172.16.0.1/yum@g
文件内容如下:
# repos on instructor for classroom use
# Main rhel5 server
[base]
name=Instructor Server Repository
baseurl=ftp://172.16.0.1/pub/Server
gpgcheck=0
# This one is needed for xen packages
[VT]
name=Instructor VT Repository
baseurl=ftp://172.16.0.1/pub/VT
gpgcheck=0
# This one is needed for clustering packages
[Cluster]
name=Instructor Cluster Repository
baseurl=ftp://172.16.0.1/pub/Cluster
gpgcheck=0
# This one is needed for cluster storage (GFS, iSCSI target, etc...) packages
[ClusterStorage]
name=Instructor ClusterStorage Repository
baseurl=ftp://172.16.0.1/pub/ClusterStorage
gpgcheck=0
十六、使用vim编辑多个文件
vim FILE1 FILE2 FILE3
:next 切换至下一个文件
:prev 切换至前一个文件
:last 切换至最后一个文件
:first 切换至第一个文件
退出
:qa 全部退出 a 即 all
十七、分屏显示一个文件
Ctrl+w, s: 水平拆分窗口
Ctrl+w, v: 垂直拆分窗口
在窗口间切换光标:
Ctrl+w, ARROW 箭头
:qa 关闭所有窗口
十八、分窗口编辑多个文件
vim -o : 水平分割显示 小 o
vim -O : 垂直分割显示
十九、将当前文件中部分内容另存为另外一个文件
末行模式下使用w命令
:w
:ADDR1,ADDR2w /path/to/somewhere ADDR1,ADDR2表示可指定范围
二十、将另外一个文件的内容填充在当前文件中
:r /path/to/somefile
二十一、跟shell交互
:! COMMAND
二十二、高级话题
1、显示或取消显示行号
:set number 等于 :set nu
:set nonu
2、显示忽略或区分字符大小写
:set ignorecase 等于 :set ic 忽略大小写
:set noic 不忽略大小写
3、设定自动缩进
:set autoindent 等于 :set ai 自动缩进
:set noai 取消自动缩进
4、查找到的文本高亮显示或取消
:set hlsearch
:set nohlsearch
5、语法高亮
:syntax on
:syntax off
二十三、配置文件
/etc/vimrc 全局配置
~/.vimrc 当前用户家目录下配置
# bash脚本编程之六 使用脚本选项及组合条件测试
组合测试条件
-a: 与关系 and
-o: 或关系
!: 非关系
if [ $# -gt 1 -a $# -le 3 ] 或
if [ $# -gt 1 ] && [ $# -le 3 ] 这两种写法相等
q, Q, quit, Quit
# linux文件查找详解
grep, egrep, fgrep: 文本查找
文件查找:
locate:
非实时,模糊匹配,查找是根据全系统文件数据库进行的;
updatedb, 手动生成文件数据库
速度快
find:
实时
精确
支持众多查找标准
遍历指定目录中的所有文件完成查找,速度慢;
直接使用find命令可列出当前文件夹下的所有文件及文件夹
find file 则列出file文件下所有的文件及文件夹
find 查找路径 查找标准 查找到以后的处理运作
查找路径:默认为当前目录
查找标准:默认为指定路径下的所有文件
处理运作:默认为显示
匹配(查找)标准:
-name 'FILENAME':对文件名作精确匹配
文件名通配:
*:任意长度的任意字符
?
[]
-iname 'FILENAME': 文件名匹配时不区分大小写
-regex PATTERN:基于正则表达式进行文件名匹配
-user USERNAME: 根据属主查找
-group GROUPNAME: 根据属组查找
-uid UID: 根据UID查找 当把一个用户删除时,他的文件属主变为其ID号,查无此人,只能查其以前的ID
-gid GID: 根据GID查找
-nouser:查找没有属主的文件
-nogroup: 查找没有属组的文件
-type f/d/c/b/l/p/s
f: 普通文件
d:目录文件
c:字符文件
b:块
l:链接
p:管道设备
s:套接字设备
-size [+|-]numdanwei 用法 -size +10M 查找(find)大小在10M以上的文件
#k
#M
#G
注意:指定单位时,如1M,则小于1M的(即0.几M的文件)也会包括进来
指定10M时则(9M,10M]之间的文件也会显示,即匹配的是一个单位的文件。
组合条件:
-a 即and
-o 即or
-not 如 find /tem -not -type d 将-note放在条件之前,如在/tem文件夹下查找不是目录的文件
/tmp目录,不是目录,并且还不能套接字类型的文件
find /tem -not -type d a -not -type s 或者 find /tem -not \(-type d -o -type s\)
/tmp/test目录下,属主不是user1,也不是user2的文件;
根据访问时间查找文件:
-mtime 修改的时间,单位:天
-ctime change时间,单位:天
-atime 访问时间,单位:天
[+|-]# #表示数字 []内的内容可省略
以分钟为单位
-mmin 如 find ./ -amin -5
-cmin
-amin
[+|-]#
stat file 查看file文件的时间戳信息。
-perm MODE:精确匹配
/MODE: 任意一位匹配即满足条件
-MODE: 文件权限能完全包含此MODE时才符合条件,即文件包含此权限就行
-644
644: rw-r--r-- 可显示此文件
755: rwxr-xr-x 可显示此文件
750: rwxr-x--- 不能显示此文件
find ./ -perl -001
动作:
-print: 显示
-ls:类似ls -l的形式显示每一个文件的详细信息
-ok COMMAND {} \; 每一次操作都需要用户确认 或者等于
-exec COMMAND {} \; 不需要确认 execute
{}表示引用find找到的文件
如 find ./ -perm -020 -exec mv {} {}.new \; 表示找到当前目录下的包含020权限的文件,并将原文件名改为原文件名后加.new的新文件
1、查找/var目录下属主为root并且属组为mail的所有文件;
find /var -user root -group mail
2、查找/usr目录下不属于root,bin,或student的文件;
find /usr -not -user root -a -not -user bin -a -not -user student
find /usr -not \( -user root -o -user bin -o -user student \)
3、查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;
find /etc -mtime -7 -not \ ( -user root -o -user student \)
find /etc -mtime -7 -not -user root -a -not -user student
4、查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root;
find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;
5、查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中;
find /etc -size +1M >> /tmp/etc.largefiles
6、查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;
find /etc -not -perm /222 -ls
xargs 的用法
以下两行的写法效果相同:
find /etc -size +1M -exec echo {} >> /tmp/etc.largefiles \;
find /etc -size +1M | xargs echo >> /tmp/etc.largefiles
[find命令参考](https://www.cnblogs.com/xqzt/p/5427173.html)
在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec执行。
但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。
这就是xargs命令的用处所在,特别是与find命令一起使用。
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。
这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
# 特殊权限SUID等详解
特殊权限
passwd:s
SUID: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者;
chmod u+s FILE
chmod u-s FILE
如果FILE本身原来就有执行权限,则SUID显示为s;否则显示S;
SGID: 运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组;
chmod g+s FILE
chmod g-s FILE
develop team, hadoop, hbase, hive
/tmp/project/
develop
Sticky: 在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件;
chmod o+t DIR
chmod o-t DIR
SUID,SGID,Sticky
000:
001:
...
110:
111:
chmod 5755 /backup/test 四位数的权限,最前面的那个表示SUID,SGID,Sticky的权限。
umask 0022
# facl及用户及Linux终端
`此视频画面相对于声音延迟。`----播放器快进问题
FACL:Filesystem Access Control List
利用文件扩展保存额外的访问控制权限
`这部分没看`
几个命令:
w
who
每隔5秒钟,就来查看hadoop是否已经登录,如登录,显示其已经登录,并退出;
sleep
whoami
last,显示/var/log/wtmp文件,显示用户登录历史及系统重启历史
-n #: 显示最近#次的相关信息
lastb,/var/log/btmp文件,显示用户错误的登录尝试
-n #:
lastlog: 显示每一个用户最近一次的成功登录信息;
-u USERNAME: 显示特定用户最近的登录信息
basename
$0: 执行脚本时的脚本路径及名称
mail
hostname: 显示主机名
如果当前主机的主机名不是www.magedu.com,就将其改为www.magedu.com
如果当前主机的主机名是localhost,就将其改为www.magedu.com
如果当前主机的主机名为空,或者为(none),或者为localhost,就将其改为www.magedu.com
[ -z `hostname` ] || [ `hostname` == '(none)' -o `hostname` == 'localhost' ] && hostname www.magedu.com
生成随机数
RANDOM: 0-32768
随机数生成器:熵池
/dev/random:
/dev/urandom:
写一个脚本,利用RANDOM生成10个随机数,并找出其中的最大值,和最小值;
#!/bin/bash
#
declare -i MAX=0
declare -i MIN=0
for I in {1..10}; do
MYRAND=$RANDOM
[ $I -eq 1 ] && MIN=$MYRAND
if [ $I -le 9 ]; then
echo -n "$MYRAND,"
else
echo "$MYRAND"
fi
[ $MYRAND -gt $MAX ] && MAX=$MYRAND
[ $MYRAND -lt $MIN ] && MIN=$MYRAND
done
echo $MAX, $MIN
# bash脚本编程之七 case语句及脚本选项进阶
面向过程
控制结构
顺序结构
选择结构
循环结构
选择结构:
if: 单分支、双分支、多分支
if CONDITION; then
statement
...
fi
if CONDITION; then
statement
...
else
statement
...
fi
if CONDITION1; then
statement
...
elif CONDITION2; then
statement
...
esle
statement
...
fi
case语句:选择结构
case SWITCH in
value1)
statement
...
;;
value2)
statement
...
;;
*)
statement
...
;;
esac
其中分号也可写为下面这种方式:
例子:
#!/bin/bash
#
case $1 in
[0-9])
echo "A digit." ;;
[a-z])
echo "Lower." ;;
[A-Z])
echo "Upper." ;;
*)
echo "Special character." ;;
esac
当输入大写字母脚本错误识别为小写字母时,
两个解决方法:
1、export LANG=C
2、判断条件改下
[A-Z]改为[[:upper:]]
[a-z]改为[[:lower:]]
a-z
A-Z
0-9
[abc]
只接受参数start,stop,restart,status其中之一
#!/bin/bash
#
DEBUG=0
ADD=0
DEL=0
for I in `seq 0 $#`; do
if [ $# -gt 0 ]; then
case $1 in
-v|--verbose)
DEBUG=1
shift ;;
-h|--help)
echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"
exit 0
;;
--add)
ADD=1
ADDUSERS=$2
shift 2
;;
--del)
DEL=1
DELUSERS=$2
shift 2
;;
*)
echo "Usage: `basename $0` --add USER_LIST --del USER_LIST -v|--verbose -h|--help"
exit 7
;;
esac
fi
done
# Linux压缩及归档
压缩、解压缩命令
压缩格式:gz, bz2, xz, zip, Z
压缩算法:算法不同,压缩比也会不同;
compress: FILENAME.Z
uncompress
gzip: .gz
gzip /PATH/TO/SOMEFILE:压缩完成后会删除原文件
-d: gzip -d 相当于 gunzip 命令
-#:1-9,指定压缩比,默认是6;
gunzip:
gunzip /PATH/TO/SOMEFILE.gz: 解压完成后会删除原文件
zcat /PATH/TO/SOMEFILE.gz: 不解压的情况,查看文本文件的内容
bzip2: .bz2
比gzip有着更大压缩比的压缩工具,使用格式近似
bzip2 /PATH/TO/SOMEFILE
-d
-#: 1-9,默认是6
-k: 压缩时保留原文件
bunzip2 /PATH/TO/SOMEFILE.bz2
bzcat /PATH/TO/SOMEFILE.gz: 不解压的情况,查看文本文件的内容
xz: .xz
xz /PATH/TO/SOMEFILE
-d
-#: 1-9, 默认是6
-k: 压缩时保留原文件
unxz
xzdec
xzcat
zip: 既归档又压缩的工具
zip FILENAME.zip FILE1 FILE2 ...: 压缩后不删除原文件
如压缩test文件夹可写为:zip test.zip test/*
unzip FILENAME.zip
archive: 归档,归档本身并不意味着压缩
xz, bz2, gz
tar: 归档工具, .tar
-c: 创建归档文件
-f FILE.tar: 操作的归档文件,file.tar必须直接跟在-f选项之后才行。
tar -cf file.tar file1 file2 ...
tar -xf file.tar 不能写为tar -fx file.tar
-x: 展开归档
--xattrs: 归档时,保留文件的扩展属性信息
-t: 不展开归档,直接查看归档了哪些文件
用法:-tf file.tar 查看归档文件file.tar中包含了哪些文件。
-zcf: 归档并调用gzip压缩
如: tar -zcf test.tar.gz test*.txt 将符合表达式test*.txt的文件归档并使用 gzip压缩
-zxf: 调用gzip解压缩并展开归档,-z选项可省略
-ztf: 不解压,直接看归档文件,-z选项可省略
-jcf: 归档并调用bzip2压缩
-jxf: 调用bzip2解压缩并展开归档,-j选项可省略
-jtf: 不解压,直接看归档文件,-j选项可省略
-Jcf: 归档并调用xz压缩
-Jxf: 调用xz解压缩并展开归档,-J选项可省略
-Jtf: 不解压,直接看归档文件,-J选项可省略
tar.gz 压缩与解压缩
解压:tar -xzvf file.tar.gz
压缩:tar -czvf namefile.tar.gz file
cpio: 归档工具
写一个脚本,能让用户输入两个数值,并自动求和
#!/bin/bash
# -n 表示输出不换行
echo -n "input two intergers split with space: "
read A B
echo "$A plus $B is: $[$A+$B]
或者写为
#!/bin/bash
#
read -p "input two intergers split with space: " A B
echo "$A plus $B is: $[$A+$B]
变量引用
NAME=file.tar
${NAME}.gz 表示file.tar.gz
$NAME 表示file.tar
练习:写一个脚本
从键盘让用户输入几个文件,脚本能够将此几个文件归档压缩成一个文件;
read:
-p "PROMPT": 给出提示
脚本编程:
顺序结构
选择结构
if
case
循环结构
for
while
until
while循环:适用于循环次数未知的场景,要有退出条件
语法:
while CONDITION; do
statement
...
done
计算100以内所有正整数的和
#!/bin/bash
declare -i I=1
declare -i SUM=0
while [ $I -le 100 ]; do
let SUM+=$I
let I++
done
echo $SUM
练习:转换用户输入的字符为大写,除了quit:
#!/bin/bash
#
read -p "Input something: " STRING
while [ $STRING != 'quit' ]; do
echo $STRING | tr 'a-z' 'A-Z'
read -p "Input something: " STRING
done
练习:每隔5秒查看hadoop用户是否登录,如果登录,显示其登录并退出;否则,显示当前时间,并说明hadoop尚未登录:
#!/bin/bash
#
who | grep "hadoop" &> /dev/null
RETVAL=$?
while [ $RETVAL -ne 0 ]; do
echo "`date`, hadoop is not log."
sleep 5
who | grep "hadoop" &> /dev/null
RETVAL=$?
done
echo "hadoop is logged in."
主要参考马哥linux教程
网友评论