最近阅读《Linux命令与Shell脚本编程大全》,重新学习了一下Linux基础,对一些常用的命令进行了笔记。
有幸刚毕业的时候就接触到了Linux,对一些常用的命令相对比较熟悉。如今工作中用到Linux的机会不是很多,
重新学习一下,加深理解,以便对后边Linux相关的学习有所帮助。
1.常用命令
ln sourceFile destinationFile 创建硬链接文件
ln -s sourceFile destinationFile 创建软连接文件,源文件删除 软连接文件不可用
df 查看挂载磁盘的信息(物理空间,可用空间,剩余空间等) -h 以M为单位
du 查看当前目录下的文件和子目录所占空间大小
ps -ef 查询某刻正在运行的进程,并以完整格式显示出来
ps -l 查询某刻正在运行的进程,并以长格式显示出来
top 动态显示正在运行的进程
top -Hp pid 显示该进程下的所有线程
2.内建命令,外部命令命令区分
type [-a] +命令 查看该命令是内建命令还是外部命令
外部命令需要生成子进程来执行,因此,相比之下 内建命令速度快,效率高
3.命令列表,进程列表区分
命令列表; pwd ; ls ; cd ; .... 不会生成子shell
进程列表: (pwd ; ls ; cd ; ....) 会生成子shell
bash 命令会生成子shell
4.后台进程
命令 + & 该命令在后台进行 会生成一个 作业号 和进程id 如:
sleep 20&
[1] 2184
可以通过pe -ef 或 jobs进行查看
5.协程
协程: coproc 不仅会创建子shell,还会进入后台模式
coproc sleep 10
[1] 2544
6.history命令
history 查询使用过的命令
存放在 .bash_history文件中
7.查询已定义变量
set vs env/printenv
set :显示全局变量/局部变量/用户自定义变量
env/printenv:只显示全局变量 printenv HOME 可以输出单个变量的值
8.变量相关
变量名=value
unset + 变量名 删除环境变量
echo $变量名 输出环境变量
export 变量名 将变量设为全局变量 可以在子shell中使用,子shell修改删除此全局变量,仅在子shell中生效,父shell依然能访问
变量永久化:将变量的声明和赋值写在.bashrc启动文件中
9.系统重要配置文件
系统全局变量 :/etc目录
profile, .bash_profile, .bash_login, .bashrc, .profile
profile文件是bash shell 默认的主启动文件,每个用户登录都会执行这个启动文件
另外四个文件针对用户
$HOME目录下的启动文件
.bash_profile, .bashrc, .bash_login, .profile
大多数Linux发行版只用到了以上一到两个
shell 会按照以下顺序读取
.bash_profile
.bash_login
.profile
没有.bashrc的原因: 该文件通过其他文件运行
$HOME 表示某个用户的主目录,和~的作用一样
10.数组
数组: arr=(one two three)
echo $arr 结果 one
echo ${arr[1]} 结果two 注意括号
echo ${arr[*]} 结果 one two three
unset ${arr[1]} echo ${arr[*]} 结果 one three
unset arr 删除数据变量
11.用户,组
管理用户:
useradd userdel usermod
useradd username 增加用户
passwd username 修改密码
userdel username 删除用户信息,不会删除文件 -r 删除对应文件目录
usermod username -l(L小写) newusername 改变用户登录名
usermod username -L 锁定账户 -U接触锁定
管理组:
groupadd groupmod
文件 全权限 666 减去 unmask 022 默认权限 644
目录 全权限 777 减去 unmask 022 默认权限 755
unmask 026 设置 需从对象减去的默认权限
设置文件权限:
八进制模式
chmod 760 filename
符号模式:
chmod [ugoa] [+-=] [rwxXstugo....]
chown [u][u.g][.g] filename 更改文件属主,属组 .或者:
chgrp g filename 更改文件属组
echo
-n 将文本字符串和命令输出显示在同一行
12.命令替换:
将命令输入复制给变量 方式: 1)var1=`date` 2)var1=$(date)
13.重定向:
输出重定向: > 用例:echo hello world > b.txt
输出追加重定向: >>
输入重定向: < 用例:cat < b.txt
内联输入重定向:<< 用例: cat << EOF
> hello
> morning
> bye
>........
> EOF
14.管道: |
用例: cat b.txt | sort
15.数学运算:
expr 1 + 5 (运算符与值之间必须有空格, 特殊符号 用\转义 \*) 相当于一个命令输出
可以使用变量 expr $var1 + $var2
$[1+6] 相当于 数学运算 + 命令替换 ,给变量赋值 运算符与值可以没有空格 只支持整数运算
可以使用变量 $[$var1 + $var2]
16.bc计算器: 可以计算浮点数
用例: [oxx@localhost Documents]$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
2.2*2
4.4 //计算结果
3.250 * 4
13.000
scale=4;3+3
6
1/3
.3333
scale=5 //设置小数位数
1/3
.33333
双括号((condition)) 可以是任意数学赋值或比较表达式 ,如>>, <<, **(幂乘),...
双方括号[[condition]] 支持字符串的高级特性,模式匹配,如 if [[ $USER == r* ]] ,USER变量是否以r开头
$? 上一条以执行命令的状态码 0~255 ,如果退出状态码超出255 则会模256
命令成功执行 $? 输出为0
shell脚本以最后一个命令的退出状态码退出
exit 指定状态码
用例: var1=300
exit $var1
17.结构化命令:
1)if语句: 只有当if后边的命令退出状态码为0 才执行then后边的语句
格式 :
if commands if commands; then
then commands
commands fi
fi
2)if else语句
if commads
then
commands
else
commands
fi
3)if elif语句
if commands
then
commands
elif commands
then
commands
else
commands
fi
18.test测试命令
范围:整数(-eq,-ge,-gl,-le,-lt,-ne),字符串(=,!=,>, <,-n 长度非0,-z 长度为0 ‘’或未定义的变量长度为零),文件(-d, -e(文件/目录是否存在),-f,-r,-s(文件内容是否非空),-w,-x,-O(文件是否属于当前用户所有),-G(文件默认组是否与当前用户相同), file1 -nt file2 (file1是否比file2新), file1 ot file2(文件file1 是否比file2 旧))
字符串比较时, > , < 必须用\转义,否则当重定向处理
test命令 中的条件成立 ,退出状态码为0,否则退出状态码非0
if test condition
then
commands
fi
等价于:
if [ condition ] //方括号 必须与 内部的条件留有空格
then
commands
fi
19.case用法:
case variable in
pattern1 | pattern2) commands;;
pattern3) commands;;
*) commands;;
esac
20.for用法:
for var in option
do
commands
done
option: 1) var1 var2 var3 var4 用空格分开
2) $var 变量
3) $( cat filename ) 命令替换
4) /bin/* /etc/passwd 通配符读取目录
C语言风格的for
for (( a=1,b=10; a <= 10; a++,b--))
do
commands
done
21.内部字段分隔符IFS
默认情况下 bash shell 会将空格,制表符,换行当做字段分隔符
IFS=:;“ 改变IFS默认值, $'\n'换行符专用
22.while用法:
多条命令 必须换行, 且以最后一条命令的退出状态码为准,为0执行循环语句
while test condition1
condition2
do
commands #如需计算赋值 记得用 $[] 或 expr方式
done
23.until用法:
多条命令 必须换行, 且以最后一条命令的退出状态码为准,为非0执行循环语句
until test condition1
condition2
do
commands
done
24.退出循环:
break n: 默认break 退出一个循环 n指定退出几个循环
continue n: 默认 continue 退出一个循环的当前循环 n指定退出的循环数
25.位置参数:
$0,$1,$2.....${10},${11} 跟在脚本后边
$0 返回脚本名(可能会带有全路径或者命令./)
basename $0 返回脚本名(不会带有全路径)
26. $* VS $@
$# 返回命令行参数的个数
$* $@ 返回命令行所有参数
$* 会将所有参数当作一个字符串
$@ 会将所有参数当作统一字符串的不同单词
可用for循环 遍历 for param in "$*" 注意 引号
27.对循环的输出进行管道或重定向:
在done命令之后添加| 或者 >
也可以使用输入重定向< 将内容传送个循环条件
28.read命令
read 读取用户输入
read -p 命令行显示提示
read -t 设置超时时间
read -s 命令行输入,但不显示在控制台(如密码)
read -s -t 3 -p "echo your name:" [parameterName]
echo your name is $REPLY //如果parameterName 为空 默认赋值给REPLY
29.shift 命令
向左删除位置参数
sh test.sh a b c d
$1 是 a shift 之后 $1 是b
30.文件描述符:
0:标准输入 1:标准输出 2:错误输出
cat test1 > test2 将正常信息输入到test2
cat test1 2> test2 将错误信息输入到test2
cat test1 2>test2 1>test3 将正常输出输到test3,将错误信息输到test2
cat test1 &> test2 将正常输出和错误信息输到test2
cat test1 >> test2 将正常输出追加到test2
31.脚本中使用重定向:
1)临时重定向
test.sh中:
#!/bin/bash
echo "msg ouput in redirect test file" >&1
echo "error msg output in redirect test01 file" >&2
echo "end message ouput in terminal"
执行: sh test.sh 1> corrFile 2> errFile
corrFile内容:
msg ouput in redirect test file
end message ouput in terminal
errFile内容:
error msg output in redirect test01 file
结论:默认标准输出 所以corrFile中有两条数据
2)永久重定向 exec命令
标准输出及错误输出案例
redirect02.sh内容:
#!/bin/bash
exec 1>corrFile
exec 2>errFile
echo "corr message ouput in corrFile";
echo "err message ouput in errFile" >&2;
执行sh redirect02.sh
corrFile内容:
corr message ouput in corrFile
errFile内容:
err message ouput in errFile
标准输入案例
#!/bin/bash
redirect03.sh内容:
exec 0< content
count=1;
while read line #从文件中读取
do
echo $count line: $line
count=$[ $count + 1 ]
done
执行 sh redirect03.sh
控制台输出:
1 line: English
2 line: Chinese
3 line: Japanese
4 line: Indian people
自定义重定向 数字 3-8可供使用 0标准输入 1标准输出 2错误输出
redirect04.sh内容:
#!/bin/bash
exec 5> corrFile
echo "This is my defined command" >&5
执行 sh redirect04.sh
corrFile内容:
This is my defined command
恢复已重定向的文件描述符
redirect05.sh内容:
#!/bin/bash
exec 3>&1
exec 1> corrFile
echo "hello everybody"
exec 1>&3
echo "I'm back"
执行 sh redirect05.sh
corrFile 内容:
hello everybody
控制台输出:
I'm back
可使用3-8等供使用的文件描述符 记住之前的重定向文件符进行恢复 1>&3 必须挨着写
同理: 输入重定向恢复 exec 6<&0
exec 0< content
....
exec 0<&6
读写文件描述符 exec 5<> test.txt
写的内容会覆盖原来的内容 read line <$4 <$4必须加上,因为不是标准输入,read默认从标准输入STDIN读取
关闭文件描述符&-: 案例 exec 3>&-
关闭之后 重新启用该文件描述符,操作同一个文件 如有输出会内容覆盖
阻止信息输出 案例 ls -al > /dev/null
清空文件 cat /dev/null > test.txt
32.创建临时文件
创建本地临时文件 mktemp filename.XXXXXX
6个大写的X不能少 执行命令之后会输出文件全路径 1.dO7w7u
mktemp -t filename.XXXXXX 会在系统的临时目录/tmp 穿件
穿件临时文件夹 mktemp -d dir.XXXXXX
33.记录消息:tee
会将消息显示在标准输出的同时,还会在指定文件保存一份
date | tee test.txt
控制台: Sun Jan 17 06:33:37 PST 2021
test.txt内容:Sun Jan 17 06:33:37 PST 2021
tee -a test.txt 追加内容
34.捕获信号 trap:
trap commands signals
以SIGINT为例, ctrl+c会触发SIGINT信号
cat trapScript.sh
#!/bin/bash
trap "echo sorry, you can\'t stop script" SIGINT
for (( i = 0; i < 5; i++ ))
do
sleep 3
echo $i
done
将捕获所有的ctrl+c 命令 脚本继续运行 trap - SIGINT 恢复默认行为,也是终止脚本
35.后台模式运行 &
运行脚本会生成一个作业号:
sh trapScript.sh &
[1] 5100
[***@localhost myscripts]$ 0
1
2
3
4
后台脚本的STDOUT,STDERR消息会显示到控制台 终端回话退出,后台脚本也会退出
36.nohup命令
nohup + command 允许命令在退出终端后继续执行
nohup: 脚本不会随着终端回话退出而退出
hohup sh trapScript.sh &
会将STDOUT STDERR消息显示到当前目录的nohut.out文件中
37.查看作业: jobs
jobs -l 会显示作业号
-p 只列出作业的PID
-r 只列出运行中的作业
-s 只列出已经停止的作业
38.作业相关
ctrl+z 停止作业
bg + 作业号 以后台的形式重启作业
fg + 作业号 以前台的形式重启作业
39.优先级
设置优先级: -20~19 值越小优先级越高 默认为0
nice -num command 设置num优先级 普通用户只能降低优先级
renice 可以设置运行中进程的优先级 renice -num -p pid 将pid的优先级设为num
40.定时任务:
at vs cron
at:
at [-f filename] time -f读取文件名
例如: at -f xx.sh now
cron:
min hour dayofmonth month dayofweek command
cron 允许使用特定值,取值范围(1~5),通配符 *
at命令在预设的时间运行脚本;cron程序定期运行脚本
41.函数:
格式:
1)function name(){commands}
2)name(){commands}
shell中 用return 给函数返回特定的状态码 模256,只能是数值
函数返回字符串:
fun4(){
echo hello
}
result=$(fun4)
2.函数传参数
fun5(){
echo $[ $1 + $2 ]
}
result=$(fun5 1 2)
42.函数局部变量 local + name
43.函数库:
将多个函数定义在一个文件中,脚本中调用时首先得引用函数库
. ./functions 或 source functions (函数库和脚本在同一目录下)
例如: 库函数 cat funLibscript.sh
#!/bin/bash
function add(){
echo $[ $1 + $2 ]
}
multiply(){
echo $[ $1 * $2 ]
}
divide(){
echo $[ $1 / $2 ]
}
minus(){
echo $[ $1 - $2 ]
}
测试:
#!/bin/bash
source ./funLibscript.sh
value1=12
value2=4
addResult=$(add value1 value2)
echo "add result is $addResult"
mulResult=$( multiply value1 value2 )
echo "multiply result is $mulResult"
divideResult=$(divide value1 value2)
echo "divide result is $divideResult"
minusResult=$(minus value1 value2)
echo "minus result is $minusResult"
echo -e 识别 \t 等符号
echo -en 去掉末尾的换行符
44.sed 行编辑器 不会改变原文件中的数据
1. sed options script file
-e 使用多个编辑命令
-f 使用脚本中的编辑命令,如果编辑命令较多,可以放入一个脚本中
sed编辑器会将指定的命令应用到STDIN输入流上,可以通过管道输入给sed编辑器进行管理
echo 'hello world' | sed 's/world/xindanding/' 将world用xindanding替换,最后的/不能省, 多个命令 单引号不能省
2.处理文件
sed 's/world/xindanding/' sedContent 将文件中的每行的第一个world用xindandin替换
3.多个编辑命令
sed -e 's/world/xindanding/;s/black/white' sedContent 将文件中每行的第一个替换
4.使用脚本
sed -f sedCommand.sed sedContent
cat sedCommand:
s/world/xindanding/
s/black/white/
5.替换标记
s/pattern/repacement/flags
默认只替换每行的第一个
数字: 表名新文本将替换第几处模式匹配的地方
g:表名新文本将替换所有匹配的文本
p:将原先的文本内容打印出来
w file:将替换结果写到文件中
6.使用地址:
数字方式寻址
sed '2s/dog/cat/' data1.txt
只修改第二行的文本,同理 2,3s/.... 修改2-3行的文本,2,$s/..修改从第二行到最后一行的文本。
sed '2{
s/fox/elephant/
s/dog/cat/
}' data1.txt
命令分组
使用模式匹配
sed '/xindanding/s/cat/dog/' data1.txt
对匹配xindanding的行 进行替换
7.删除行,不会修改原始文件
sed 'd' data1.txt
删除所有的行 sed '3d' data.txt 删除第三行 '2,3d', '2,$d'同理
sed '/xindanding/d' data1.txt
删除匹配的行
8.插入行
insert: 在指定行之前插入
echo 'hello world' | sed 'i\ xindanding'
输出: xindanding
hello world
对于文本文件可以指定行 3i,等等 反斜杠可以不加 识别第一个i字符
append: 在指定行之后插入
echo ‘hello world’ | sed 'a\xindanding'
输出: hello world
xindanding
9.修改行
sed '3c\ hello' data1.txt
第三行用hello代替
sed ‘/xindanding/c\ hello’ data1.txt
匹配xindanding的行 用hello代替
10.转换命令
sed ‘y/123/789' data1.txt
全局的,不只针对一行 会对转换的字符一一对应,7替换1,8替换2....
45.gawk :
gawk options script file
-F 指定行中字段分隔符
-f 从指定文件中读取程序
gawk程序必须放到{}中,如果脚本是单个文本字符串,还需要用‘’单引号包裹
gawk '{print "hello world"}' 没有指定文件名 默认从STDIN中接收
数据字段变量
$0 代表整个文本 $1代表第一个数据字段 $2代表第二个数据字段....
gawk '{print $1}' gawkContent
默认识别空格和制表符 输出每行的第一个字段
gawk -F: '{print $1}' gawkContent
以:作为分隔符
在脚本中使用多个命令
echo "my name is joke" | gawk '{$4="xindanding";print $0}'
my name is xindanding
xindanding必须用引号包含
使用脚本
gawk -f gawkCommand.gawk gawkContent
cat gawkCommand
{print $1 , $2}
处理数据的前后运行的脚本 ,区分大小写
BEGIN ‘{}’ 处理数据前运行的脚本
END '{}' 处理数据后运行的脚本
gawkCommand.gawk:
BEGIN{print "starting...."}
{print $1,$2}
END {print "end...."}
运行:
[oxx@localhost myScripts]$ gawk -f gawkCommand.gawk gawkContent
starting....
One line
Two line
Three line
end....
46.网络连接方式:
1.桥接:
客户机就相当于真是主机。可以访问互联网,设置IP,互相访问。
如果没有网络,主机之间无法连接。
2.NAT: 网络地址转换
client和宿主机形成网络,客户机可以访问互联网,由宿主机做
DNS和NAT,IP也是由宿主机分配,客户机无法访问网络中的其他主机
没有网络的情况下,宿主机和客户机仍然是连通的,但客户机不能修改IP
3.Only host: 和NAT非常相似,只不过,client机不能访问互联网