一.首先,什么是shell
shell翻译成壳的意思,它是包裹在linux内核外层的,一个可通过一系列的linux命令对操作系统发出相关指令的人机界面。 shell可以通过其条件语句和循环语句等,把一系列linux命令结合在一起,形成一个相当于面向过程的程序,shell script,来实现一些较为复杂的功能。
总括,shell是linux命令集的概称,是属于命令行的人机界面。Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。Ken Thompson的sh是第一种Unix Shell,Windows Explorer是一个典型的图形界面Shell。Shell 和Shell Script不是一回事,通常我们说的都是Shell Script。
由定义可知, shell相当于经过装饰的命令行,和命令行一样,都能操作linux。但是shell是面向过程的,相当于有了一定的逻辑和过程,而命令行只是单一的操作。
二.常用命令
1. telnet
语法:telnet 主机名 或 telnet IP地址
telnet 130.129.21.250
2.ll 文件或目录处理:列出文件或目录下的文件名。
语法: ls [-atFlgR] [name]
ls 列出目前目录下的文件名。
ls -a 列出包括以 .开始的隐藏文件的所有文件名。
ls -t 依照文件最后修改时间的顺序列出文件名。
ls -F 列出当前目录下的文件名及其类型。以/ 结尾表示为目录名,以* 结尾表示为可执行文件,以@ 结尾表示为符号连接。
ls -l 列出目录下所有文件的权限、所有者、文件大小、修改时间及名称。
ls -lg 同上,并显示出文件的所有者工作组名。
ls -R 显示出目录下以及其所有子目录的文件名。
3.cd 改变工作目录
语法:cd [name]
name:目录名、路径或目录缩写。
cd - //返回到原来的目录
4.cp: 复制文件
语法: cp [-r] 源地址 目的地址
cp -r dir1 dir2 复制整个目录。
5.mv : 移动或更改文件、目录名称
语法:mv 源地址 目的地址
6.mkdir: 建立新目录
语法: mkdir 目录名
7.rm 和rmdir: 删除目录
语法: rmdir 目录名 或 rm 目录名
rmdir dir1 删除目录 dir1,但 dir1 下必须没有文件存在,否则无法删除。
rm -r dir1 删除目录 dir1及其子目录下所有文件
8.rm: 删除文件
rm file? 删除文件名中有五个字符且前四个字符为file 的所有文件。
rm f* 删除文件名中以 f 为字首的所有文件。
9.pwd: 列出当前所在的目录位置
10.cat: 查看文件内容
cat file1 以连续显示方式,查看文件名 file1 的内容。
11.more:分页查看文件内容
语法: more 文件名 或 cat 文件名 | more
12.查看目录所占磁盘容量
语法: du [-s] 目录
du dir1 显示目录 dir1 的总容量及其子目录的容量(以KB 为单位)。
du -s dir1 显示目录 dir1 的总容量(以KB 为单位)。
du -sh dir1 显示目录 dir1 的总容量(以M 为单位)。
13.文件权限的设定
(1)改变文件或目录的读、写、执行权限
语法:chmod [-R] mode name
name :文件名或目录名
chmod -R 777 xml.go
(2)改变文件或目录的所有权
语法:chown [-R] 用户名 name
chown vagrant xml.go
14. groups: 检查自己所属的工作组名称
15. touch:改变文件或目录的最后修改时间(没啥意义)
语法:touch name
16.grep "关键字" 文件名: 查询关键字在文件中的位置
grep string file
17.查找文件或命令的路径
语法:whereis command 显示命令的路径。
语法:which command 显示命令的路径,及使用者所定义的别名。
语法:whatis command 显示命令功能的摘要。
sudo find / -name xml.go //查找文件的路径
18.比较文件或目录的内容
语法:d i ff [-r] name1 name2
name1 name2:必须同时为文件名或目录名。
diff file1 file2 比较文件file1 与 file2 内各行的不同之处。
diff -r dir1 dir2 比较目录 dir1 与 dir2 内各文件的不同之处
19.进程控制
(1)查看系统中的进程
语法:ps [-aux]
ps或ps -x 查看系统中,属于自己的进程。
ps -au 查看系统中,所有用户的进程。
ps -aux 查看系统中,包含系统内部的及所有用户的进程。
(2)结束或终止进程
语法:kill [-9] PID
(3)在后台执行进程的方式(不常用)
语法:命令 &
(4)jobs: 查看正在后台中执行的进程
20.history: 查看命令记录表的内容
!!: 重复执行前一个命令
! n: n代表记录表的命令编号
! cat : 重复前面执行过的以 cat 为起始字符串的命令。
显示前一个命令的内容
语法: ! !:p
21.文件的压缩
(1). 压缩文件
语法:compress 文件名 压缩文件
语法:compressdir 目录名 压缩目录
(2). 解压缩文件
语法:uncompress 文件名 解压缩文件
语法:uncompressdir 目录名 解压缩目录
22.| :管道命令的使用
语法:命令1 | 命令2 将命令1的执行结果送到命令2,做为命令2的输入。
23.输入/输出控制
(1)标准输入的控制
mail -s “mail test” 电子邮件地址 < file1 将文件file 当做信件的内容,主
题名称为 mail test,送给收信人。
mail -s "mail test" xiaowangli@huashenggroups.com < xml.go
(2)标准输出的控制
语法:命令 > 文件 将命令的执行结果送至指定的文件中。
ls -l > list 将执行 “ls -l” 命令的结果写入文件list 中。
语法:命令>! 文件 将命令的执行结果送至指定的文件中,若文件已经存在,则覆盖。
ll >list.txt
tail -30 xml.go>list2.txt
结果:list.txt内容
24.awk: 非常有用的一个文本处理命令,逐行运行,默认使用空格分割,-F
表示分割的样式
25,shell 语法
if then else : shell 文件
例子1:
#判断文件是否存在
#!/bin/bash
if [ -f Af.php ];then
echo 'file exist'
else
echo 'file not exist'
fi
exit 0
执行shell文件
bash test.sh
结果:
例子2:根据输入判断正负数
注意:[ ] 内两边要空一格.关键词左右都要空一格
#!/bin/bash
#提示用户输入一个值
echo -n "请输入一个数字:"
#保存用户输入的值到num中
read num
#[ ] 内两边要空一格
if [ "$num" -gt 0 ];then
echo '正数'
elif [ "$num" -lt 0 ];then
#elif [ "$num" -lt 0 ];then
echo '负数'
else
echo '零'
fi
exit 0
例子3:case 语句
#!/bin/bash
echo -n "你单身吗? (y/n)"
read val
case $val in
Y|y)
echo "我们约会吧"
;;
N|n)
echo "不约,再见"
;;
*)
echo "输入有误"
;;
esac
exit 0
结果:
例子4:ls 列出当前目录中文件列表
#!/bin/bash
#将结果存在CUL_DIR中
CUR_DIR=`ls` #此处不是单引号,而是`` 撇号
#显示ls 的结果
echo $CUR_DIR
for v in $CUR_DIR
do
if [ -f $v ];then
echo "FILE: $v"
fi
done
exit 0
计算输出 1-10 之间数字的总和
#!/bin/bash
sum=0
for ((i=0;i<10;i++))
do
((sum=$sum+$i))
done
echo "sum=$sum"
exit 0
例子5:使用 break 和 continue 控制循环
break 命令允许跳出循环
continue 命令类似于 break 命令,只有一点重要差别,它不会跳出循环,只是跳过这个循环步。:[break 应用] 从 0 开始逐步递增,当数值等于 5 时跳出本次循环,等于10时停止递增。
#!/bin/bash
#设置起开始值
val=0
while true
do
if [ "$val" -eq "5" ];then
#如果是val=5,则挑出循环
((val++))
continue;
elif [ "$val" -eq "10" ];then
break;
else
#输出值
echo "val:$val"
#将数值加1
((val++))
fi
done
exit 0
结果:
数组:
例子6:
数组定义:
- array=(10 20 30 40 50) 一对括号表示是数组,数组元素用 “空格” 符号分割开。引用数组时从序号 0 开始。
- var="10 20 30 40 50"; array=($var)
- 除了上面的定义方式外,也可以单独定义数组:
array[0]=10
array[1]=20
array[2]=30
array[3]=40
array[4]=50
数组操作:
#!/bin/bash
array=(10 20 30 40 50)
#显示数组中所有元素
echo "数组列表:"
echo ${array[*]}
echo ${array[@]}
#显示数组第2项
echo "显示数组第二项"
echo ${array[1]}
#a显示数组长度
echo "显示数组长度:" ${#array[*]}
echo ${#array[@]}
#输出数组的第1-3项
echo "数组的第1-3项:" ${array[@]:0:3}
#将数组中的0替换成1
echo "将数组中的0替换成1" ${array[@]/0/1}
#删除数组的第2项
#unset 仅只是清除array[1]的值,并没有将array[1]删除掉
echo '删除数组的第2项'
unset array[1]
echo ${array[@]}
exit 0
函数:
#!/bin/bash
function foo()
{
#定义局部变量i
local i=0
#定义局部变量total,传入foo 的参数总数
local total=$#
#输出参数总数
echo "total param=$total"
#输出传入foo的每一个参数
for val in $@
do
((i++))
echo "$i -- val= $val"
done
#返回参数总数
return $total
}
foo
foo param1 param2 param3
echo "return value=$?"
exit 0
~
数值运算
数值元算主要有4种实现方式:(())、let、expr、bc。
工作效率:(()) == let > expr > bc**
(())和let是bash内建命令,执行效率高;而expr和bc是系统命令,会消耗内存,执行效率低。
(())、let和expr只支持整数运算,不支持浮点运算;而bc支持浮点运算。
#!/bin/bash
#4 种方式计算3*(2+5)
#1.(())
val1=$((3*(2+5)))
echo "val1=$val1"
#2.let
let "val2=3*(2+5)"
echo "val2=$val2"
#3.expr
val3=`expr 3 \* \(5+2\)`
echo "val3=$val3"
#4.bc
val4=`echo "3*(5+2)"| bc`
echo "val4=$val4"
第3,4种有问题
字符运算
#!/bin/bash
str='hello world'
echo "显示字符串:" ${str}
echo '显示字符串长度:' ${#str}
echo '提取world:' ${str:6}
echo '提取or:' ${str:7:2}
echo '删除hello: '${str#hello}
echo '删除world: ' ${str%world}
echo '将所有的l替换为m: '${str//l/m} #此处l 前两个/,一个的话只会替换一个l
exit 0
bash 调试
bash [-nvx] scripts.sh
- 选项与参数:
- -n: 不要执行 script,仅查询语法的问题;
- -v: 再执行 sccript 前,先将 scripts 的内容输出到屏幕上;
- -x: 将使用到的 script 内容显示到屏幕上,这是很有用的参数!
例子:想要执行 bash 脚本,并查看 bash 的调用流程,可以通过以下命令:
bash -x test.sh
echo [-neE] string
选项与参数:
- -n: 输出内容之后,不换行。默认是输入内容之后,换行。
- -e: 开启反斜线“\”转义功能
- -E: 开启反斜线“\”转义功能(默认)。
- 例子:输出 please input a number: 之后不换行
bash 内建指令
echo
在屏幕上显示出指定的字串read
从标准输入设备读入一行,分解成若干字,赋值给 bash 程序内部定义的变量alias
别名,alias l='ls -al'export
export 可以把 bash 的变量向下带入子 bash (即子 bash 中可以使用父 bash 的变量),从而让子进程继承父进程中的环境变量。但子 bash 不能用 export 把它的变量向上带入父 bash。exec
当 bash 执行到 exec 语句时,不会去创建新的子进程,而是转去执行指定的命令,当指定的命令执行完时,该进程(也就是最初的 bash)就终止了,所以 bash 程序中 exec 后面的语句将不再被执行。.
使 bash 读入指定的 bash 程序文件并依次执行文件中的所有语句。exit
退出 Shell 程序,在 exit 之后可有选择地指定一个数位作为返回状态。