1.目录操作
a.切换目录
cd / |切换根目录|
cd - |切换目录|
cd ~或Enter |切换用户目录|
cd .. |返回上一级目录|
cd /var |切换/var目录|
b.创建目录
mkdir -v test |在当前目录下创建test目录| -v 显示已创建文件的提示语句
mkdir test1 test2 |在当前目录同时创建test1和test2目录|
mkdir -p test3/test4 test5 |在当前目录创建层级目录test3/test4、目录test5|
mkdir -p -m 700 test6/test7 |在当前目录下创建test6/test7目录,并给test7设置目录权限|
c.删除目录
rm -vrf test1 |在当前目录下递归删除test1目录| -v 显示详情 -r 递归删除 -f 强制删除不二次提示
d.复制目录
cp -a test test1 |复制目录test为test1目录| -a相当于pdr p保留源属性r递归复制f强制覆盖
2.文件
a.创建文件
touch file.txt |创建文件| stat file.txt |查看文件的大小和权限| file file.txt |查看文件类型|
b.查看文件
/etc/passwd root:x:0:0:root:/root:/bin/bash 登陆用户名:密码:UID:GID:备注字段:用户home目录:用户默认的shell
/etc/shadow 登陆名:加密后的密码:上次修改过去的天数:多少天才能更改密码:多少天必须修改密码:过期提醒提前多少天提醒用户修改密码:密码过期几天后禁用账户:用户禁用的日期:预留字段
/etc/group 组名:组密码:GID:属于该组的用户
cat file.txt |查看文件| -n 为文件中的所有行加行号 -b 为文件中的有文本的行加行号
vim file.txt |编辑文件| 1.行内移动 b/w向前/后移动一个单词 0^/$行首/行尾2.gg/G文件顶部/尾部 (:number 跳转行数) ctrl+f/b 向下\上翻页 光标移动到屏幕(H\M\L) 段落切换({\}) 成对括号切换(%) 标记(mx和‘x)x为a-z或A-Z 3.v可视模式|V可视行模式|ctrl+v可视块模式 4.u|ctrl+r撤销重做5. x|nx 删除单个字符 dd 删除整行 d0|d$删除到行首行尾 6. yy 复制整行 y0|y$| 7.缩进 >>|<< 进入可视模式 >|< . 重复操作 8./str|?str 向下|上查找,n,N重复操作 9.:set nu|nonu
c.压缩文件
tar -cvf archive.tar foo bar |将foo、bar文件归档archive.tar| -f指定文件名-c创建-t查看内容列表-v显示详细信息
tar -zcvf archive.tar.gz foo bar |将foo、bar文件压缩archive.tar.gz|
tar -rvf archive.tar.gz zoo |将文件zoo添加到archive.tar.gz中|
-z tar.gz gzip|ungzip|gunzip文件
-j tar.bz2 bzip2文件
-J tar.zx zx文件
d.解压文件
tar -xvf archive.tar -C test |解压archive.tar到test目录下|
tar -zxvf archive.tar.gz -C test |解压archive.tar到test目录下|
3.别名
alias mv='mv -i ' 创建别名。一个别名仅在它创建的shell进程中才有效
4.父shell进程
所有命令都是在父shell进程中执行的。直到运行bash命令,会产生子shell进程。
查看是否有子进程 echo $BASH_SUBSHELL 为0没有子进程
(命令1;命令2; echo $BASH_SUBSHELL ) 开启子shell执行
(命令1;命令2; echo $BASH_SUBSHELL ) & 开启子shell进程并后台执行
coproc sleep 3 |后台产生子shell,并在shell中执行命令。协程|
coproc Myjob { sleep 3; } |后台产生子shell,并在shell中执行命令,设置名称。协程|
命令1;命令2; echo $BASH_SUBSHELL 在父shell进程下,开启一个子进程执行
sleep 3000 & |在父shell进程下,开启一个子进程后台执行(称为job)|
5.全局变量
env 查看全局变量 echo $HOME 查看某个全局变量的值。全局变量对子bash也是起作用的
export MY_VARI="value" |设置全局变量|
PATH 环境变量定义了用于命令和程序查找的目录
PATH=PATH:/home/nginx/conf 向环境变量添加目录。PATH:.。
6.局部变量
my_variable=value或"value" 设置局部变量 echo $my_variable
unset my_variable 删除变量
7.数组变量
myarrtest=(one two three four five)
echo $myarrtest 结果:one ;echo ${myarrtest[2]} 结果:three ;
echo ${myarrtest[*]} 结果:one two three four five ; unset myarrtest 删除数组
8.登陆shell会从5个不同的文件中读取命令
/etc/profile 默认的主启动文件
$HOME/.bash_profile 启动文件会检查是否有.bashrc,有先执行
$HOME/.bashrc 文件会在上面的文件中执行
$HOME/.bash_login
$HOME/.profile
9.创建用户
useradd user1 |创建用户| -c commnet 给用户添加备注,-e 2022-05-05 设置过期日期;
-f 5 账户过期后5天被禁用,0 已过期就被禁用,-1禁用这个功能;-p passwd 指定默认密码
9.删除用户
userdel user1 |删除用户|。默认只会删除/etc/passwd文件中的用户信息。-r 会删除home及邮件目录
10.修改用户
usermod test1 |修改用户| -L 锁定用户,无法登陆;-U 解锁锁定,用户登陆;-p 修改密码
-e 设置过期日期。-l 修改登陆名。-G test1用户添加到指定组。
passwd test1 |用户自己修改密码|。
11.创建组
groupadd shared |创建shared组|
groupmod shared |修改shared组|。-n 修改组名;-g 修改组id ;-p 修改组密码
12.权限
文件一般权限rw-(6)。目录一般权限 r-x(5)。
chmod 777 test1 |修改文件权限(r 4,w 2,x 1)|
chmod o+r newFile |在现有权限的基础上增加权限|。[ugoa]为权限作用的对象。[+-=]为增加、删除、设置。[rwxXstugo] 。-R 递归赋予权限。文件可以使用通配符。
chown dan.shared|.share newFile |同时改变文件的属主和属组|
13.磁盘
IDE硬盘机 /dev/hd[a-d]
SCSI/SATA/USB硬盘机 /dev/sd[a-p]
14.shell脚本
#!/bin/bash 注释
./xx.sh 执行该脚本,$0=./xx.sh。bash/sh /root/xx.sh,$0=/root/xx.sh。. /root/xx.sh,$0=-bash。$# 脚本运行时的参数个数。$* 把所有变量当成单个参数。$@ 会单独处理每个参数。$$ 脚本运行的pid
shift 默认移动一个位置。从$1中取值
IFS=$IFS;IFS=$'\n'
$Variable 在脚本中使用变量,同时可以在字符串中,"this is $Variable"
脚本中定义变量 var1=value var2=$var1,使用变量 $var1。
将命令执行结果赋予给变量 var1=$(date)。date 日期命令。
输出/输入重定向:>|>>。ls > file.txt 将一个命令的输出作用到文件中。 wc < file.txt,wc << $PS2 |$PS2|为文本标记。
将一个命令的输出作为另一个命令的输入,这个过程叫做管道。command1 | command2。
rpm -qa | sort | more。
执行数学计算:$[$var1 * 2]。var1 = $(echo "scale=4;$var2 * $var3" | bc)
查看命令的执行状态。date;$?。
15.结构化语句
1. if command
then
commands
fi
2.if command;then
commands
fi
3.if command;then
commands
else
commands
fi
4.case $var in
rich | varbara) echo xxxx;;
*) echo xxxx;;
esac
5.for var in list;do
commands
done list为 I don\'t "new baby",可以拼接list=$list" now"。遍历文件 $(cat $file)
6.for ((a=1,b=10;a<=10;a++,b--))
do
commands
done
7. while echo $var
[$var -ge 0]
do
commands
done
8.until [...]
do
commands
done
会执行command命令,如果命令的返回状态码为0,则会运行then中的commands。否则会跳过执行。数值比较 [-ne|-eq|-ge|-le|-gt|-lt]。字符串比较 [=|!=|\<|\>|-z|-n]。文件比较 -d file 检查file是否存在且是一个目录 ,-f file 检查file是否存在且是一个文件,-e file 检查file是否存在,-r/w/x file 检查文件是否存在并可读/可写/可执行,-s file 检查文件是否存在且非空,-O/G 是否属主/默认组于当前用户相同,-nt|ot 是否比新/旧
set -- $(getopt -q ab:cd "$@") getopt命令将原始命令行参数格式化后结果,传入原始命令行。缺点不能识别"value1 value2"
16. 标准文件描述符
处理脚本的输入和输出。0 STDIN 标准输入。1 STDOUT 标准输出。 2 STDERR 标准错误。
2> file.log 重定向标准错误到文件file.log。
1> file.log 重定向标准输出到文件file.log。
&> file.log 重定向标准输出和错误到文件file.log。
脚本中使用|echo "this is an error" >&2 将消息重定向到标准错误文件描述符|,运行脚本时,使用 bash xx.sh 2> error.log,可以将错误信息重定向到错误文件。
脚本中使用exec 1>testout 将标准输出重定向到testout文件
脚本中使用 exec 0 < input.txt 将标准输入重定向到文件,而非键盘
创建输出文件描述符。exec 3>|>>file.txt和echo "xxx msg" >&3
创建输入文件描述符。exec 6<&0和exec 0<file
关闭文件描述符。exec 3>&-
删除文件内容。cat /dev/null > xxx.log。
恢复默认。1.exec 3>&1。2. exec 1> fileout 3.恢复 exec 1>&3。
17.脚本函数
1.function name {
commands
}
2. name(){
commands
}
3.调用函数:name|name value1 value2
4.使用函数返回值:value=$(name|name value1 value2)
5.传入数组:name $myarray传入数组第一个值。name ${myarray[*]} 传入整个数组。
在函数内:newarray=(`echo "$@"`)或($(echo "$@"))
18.sed命令
1.依次处理一行,将新的数据输出到STDOUT
2.sed 's/dog/cat/' data1.txt 将文本的dog改为cat输出,不改变源文本。
3.sed -e 's/dog/cat/; s/brown/green' data1.txt
4.set -f script.sed data1.txt
19.gawk
1.gawk -F : '{ $4="newWord" print $1}' data1.txt 打印文本第一列数据。$0 代表整行。$1代表文本行的第1个数据字段。-F : 指定分割符为:。 $4="newWord" 替换为新值。
2.'BEGIN {FS=",";OFS="<--->"} {$4="newWord" print $1} END {} ' 源分隔符FS,目标分隔符
OFS,换行符RS和ORS。NF字段总数。NR处理记录数。FNR 正在处理记录行数。