Shell是一个命令解释器,它接收应用程序/用户命令,然后调用操作系统内核。
脚本以 #!/bin/bash 开头来指定解析器
执行脚本 bash test.sh 或 sh test.sh,本质是bash解析器帮助执行脚本,脚本本身不需要执行
通过 ./test.sh 进行脚本执行,本质是脚本需要自己执行,需要执行权限
Linux 命令
命令 | 作用 |
---|---|
touch | 修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。 |
cd | 切换当前工作目录 |
pwd | 显示工作目录 |
cat | 连接文件并打印到标准输出设备上 |
mv | 为文件或目录改名、或将文件或目录移入其它位置 |
cp | 复制文件或目录 |
rm | 删除一个文件或者目录 |
tree | 树状图列出目录的内容 |
ls | 显示指定工作目录下之内容 |
which | 在环境变量$PATH设置的目录里查找符合条件的文件 |
whereis | 在特定目录中查找符合条件的文件 |
chmod | 控制用户对文件的权限的命令 |
clear | 清除屏幕 |
alias / unalias | 设置指令的别名 / 删除别名 |
zip / unzip | 压缩文件 / 解压缩zip文件 |
unset | 删除变量或函数 |
let | 执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量 |
export | 设置或显示环境变量 |
netstat | 显示网络状态 |
ps | 显示当前进程的状态 |
top | 实时显示 process 的动态 |
sudo | 以系统管理者的身份执行指令 |
shutdown | 进行关机程序,并且在关机以前传送讯息给所有使用者正在执行的程序 |
变量
- 变量名称不能以数字开头,环境变量名建议大写
- 定义变量 变量名=值 ,等号左右不加空格。撤销变量 unset 变量名,静态变量 readonly 变量不能 unset
- 变量默认类型是字符串类型,无法直接进行数值运算
- 变量的值如果有空格,需要加双引号或单引号括起来
- export 变量名 能将变量提升为全局变量,在其他shell程序中可使用
特殊变量
- $数字n 表示第n个脚本参数,10以上的参数需要用大括号包含${10},$0表示脚本名称
- $# 获取所有输入参数个数
- $? 最后一次执行的命令的返回状态
- $* 代表命令行中所有参数,把所有参数看成一个整体
- $@ 代表命令行中所有参数,把每个参数区分对待
for i in "$*"; do
echo $i;
done
# 1 2 3
for i in "$@"; do
echo $i;
done
# 1
# 2
# 3
引号
- 单引号:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
- 双引号:双引号里可以有变量,双引号里可以出现转义字符
- 反引号:命令替换。在执行一条命令时,会先将其中的反引号 ``,或者是$() 中的语句当作命令执行一遍,再将结果加入到原命令中重新执行。$():里面放的是命令,用来进行命令替换的。${}:里面放的是变量,用来引用变量的。
运算符
- $((运算式)) 或 $[运算式]
- expr 加+、减-、乘\*、除/、取余%,expr运算符间要有空格
条件判断
- 中括号内的条件左右两侧要有空格 [ condition ]
- 整数比较:小于-lt、小于等于-le、大于-gt、大于等于-ge、等于-eq、不等于-ne
- 文件权限判断:有读权限-r、有写权限-w、有执行权限-x
- 文件类型判断:文件存在且为常规文件-f、文件存在-e、文件存在且为目录-d
流程控制
- if 判断
if [ condition ];then # if 后要有空格
content
elif [ condition ];then
content
else
content
fi
- case语句
case $name in
val1)
content
;;
val2)
content
;;
*)
content
;;
esac
- for 循环
for ((init;condition;change))
do
content
done
for name in val1 val2 val3
do
content
done
从 ubuntu 6.10 开始,ubuntu 就将先前默认的bash shell 更换成了dash shell
使用 sh test.sh 调用脚本不支持C语言格式的for循环,而 bash test.sh可以
s=0
for ((i=1;i<10;i++))
do
s=$[$s+$i]
done
- while 循环
while [ condition ]
do
content
done
read读取控制台输入
read -t 读取等待时间(秒)-p 读取时提示字符 读取值的变量名
系统函数
- basename [pathname] [suffix] 保留最后一个 / 字符后,后缀suffix前的 字符串
- dirname abspath 去除文件名,保留目录路径
自定义函数
函数的定义和声明需要在调用函数之前,返回值只能是整数,表示执行成功与否,0表示成功
需要从函数中返回值可赋值给全局变量
[ function ] funcname[()]
{
content;
[return int;]
}
output=0
function sum()
{
s=0;
s=$[$1+$2];
echo $s;
output=$s;
}
read -p "First parameter: " a
read -p "Second parameter: " b
sum $a $b
echo $output
shell 工具
- 剪切数据: cut -f 列号 -d 分隔符
- 流编辑器: sed [-e] “command” filename 不改变原文档
-e表示直接在指令列模式上进行sed的动作编辑
命令 | 功能 |
---|---|
a | 新增,a后面加字符串,在下一行出现。例如第二行加new line字符串 “2a new line” |
d | 删除。例如删除test字符串 “/test/d” |
s | 查找并替换。例如将aaa替换成bbb “s/aaa/bbb/g” g表示global |
- 文本分析:awk [-F | -v] “pattern1{action1} pattern2{action2}…” filename
-F表示指定输入文件分隔符,-v表示赋值一个用户定义变量 - 将文件排序:sort -n数值大小 -r相反顺序 -t分隔字符 -k需排序的列
awk
格式
awk [-W option] [-F value] [-v var=value] [-f program-file] [–] [file…]
- [-F option] - 指定输入分隔符,可以是字符串或者正则表达式
- [-v var=value] - 赋值一个用户定义变量,将外部变量传给awk
- [-f program-file] - awk 允许将一段awk 程序写入一个文本文件,然后在awk 命令行中用-f 选项调用并执行这段程序。
- [-W option]
内建变量
- $0 这个变量包含执行过程中当前行的文本内容。
- $n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
- NR:已输入记录的条数。
- NF:当前记录中域的个数。记录中最后一个域可以以$NF的方式引用。
- FILENAME:当前输入文件的文件名。
- FS:“域分隔符”,用于将输入记录分割成域。其默认值为“空白字符”,即空格和制表符。FS可以替换为其它字符,从而改变域分隔符。
- RS:当前的“记录分隔符”。默认状态下,输入的每行都被作为一个记录,因此默认记录分隔符是换行符。
- OFS:“输出域分隔符”,即分隔print命令的参数的符号。其默认值为空格。
- ORS:“输出记录分隔符”,即每个print命令之间的符号。其默认值为换行符。
- OFMT:“输出数字格式”(Format for numeric output),其默认值为"%.6g"。
流程控制语句
if(condition1)
{action1}
else if(condition2)
{action2}
else
{action3}
while(condition)
{action}
for(var in arr)
{action}
for(var;condition;operation)
{action}
do
{action} while(condition)
数组
数组的索引可以是数字或字符串,不需要提前声明其大小,运行时可以自动的增大或减小。
不支持多维数组。
常用函数
- match(s, r [, a]) 检索字符串s匹配正则表达式r的内容,返回是否匹配,未匹配成功,则返回0
- length(s) 用于返回字符串长度
- index(s, sub) 用于描述子字符串sub在源字符串s中的位置,如果存在则返回位置,不存在则返回0
- split(s, a [, r [, seps] ]) 把一个字符串s分隔为单词并存储在数组a中
- printf 输出到终端
- sprintf 将输出保存在一个字符串里
- substr(s,p[,n]) 返回字符串s中从p开始长度为n的后缀部分