创建shell文件
vi hello.sh
或者
gedit hello.sh
执行shell脚本语言
chmod 755 hello.sh
绝对路径/./hello.sh
或
bash hello.sh
小注意点:shell脚本开头必须是#!/bin/bash,有点类似于Html开头<!DOCTYPE>
历史命令
格式: history [选项][历史命令保存文件]
-c 清空历史命令
-w 把缓存中的历史命令写入历史命令保存文件**~/.bash_history**(CTF小考点)
.bash_history默认保存1000条历史命令。
命令别名
临时生效:
格式: alias 别名=‘原命令’
例
alias vi=‘vim’
永久生效
修改root/.bashrc
vi /root/.bashrc
命令执行时顺序
(1)第一顺位执行用绝对路径或相对路径执行的命令
(2)第二顺位执行别名
(3)第三顺位执行bash的内部命令(shell自带的内部命令,如cd)
(4)第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
bash快捷键
Ctrl + a :移到命令行首
Ctrl + e :移到命令行尾
Ctrl + f :按字符前移(右向)
Ctrl + b :按字符后移(左向)
Alt + f :按单词前移(右向)
Alt + b :按单词后移(左向)
Ctrl + xx:在命令行首和光标之间移动
Ctrl + u :从光标处删除至命令行首
Ctrl + k :从光标处删除至命令行尾
Ctrl + w :从光标处删除至字首
Alt + d :从光标处删除至字尾
Ctrl + d :删除光标处的字符
Ctrl + h :删除光标前的字符
Ctrl + y :粘贴至光标后
Alt + c :从光标处更改为首字母大写的单词
Alt + u :从光标处更改为全部大写的单词
Alt + l :从光标处更改为全部小写的单词
Ctrl + t :交换光标处和之前的字符
Alt + t :交换光标处和之前的单词
Alt + Backspace:与 Ctrl + w 相同类似,分隔符有些差别
输出重定向
类型 | 符号 | 作用 |
---|---|---|
标准输出重定向 | 命令>文件 | 以覆盖(覆盖原文件的内容)的方式将命令的正确输出输出到指定的文件或设备中 |
命令>>文件 | 以追加的方式将命令的正确输出输出到指定的文件或设备中 | |
标准错误输出重定向 | 错误命令 2>文件 | 以覆盖的方式将命令的错误输出输出到指定的文件或设备中 |
错误命令2>>文件 | 以追加的方式将命令的错误输出输出到指定的文件或设备中 | |
正确输出和错误输出同时保存 | 命令 > 文件 2>&1或者 命令 &> 文件 | 以覆盖得方式,把正确输出和错误输出都保存到同一个文件中 |
命令>> 文件 2>&1或者 命令 &>>文件 | 以追加得方式,把正确输出和错误输出都保存到同一个文件中 | |
命令>>文件1 2>>文件2 | 把正确得输出追加到文件1中,错误的输出追加到文件2中 |
多命令顺序执行
多命令执行符 | 格式 | 作用 |
---|---|---|
; | 命令1;命令2 | 多个命令顺序执行,命令之间没有任何逻辑关系 |
&& | 命令1&&命令2 | 逻辑与,命令1正确时命令2才会执行 |
|| | 命令1||命令2 | 逻辑或,命令1不正确时命令2才会执行 |
例:
date;dd if=dev/zero of=~/testfile bs=1k count=100000;date
该命令从dev/zero中读取100000个1k个0(100M),写入到~下的testfile中,先执行左边的date,后执行dd命令,最后执行右边date,可用来计算复制100M字节所需的时间。
命令&& echo yes || echo no
命令执行成功,输出yes,命令执行不成功,输出no。
管道符
**格式:**命令1 | 命令2
命令1的正确输出作为命令2的操作对象
例:
ll-a /etc|more
ll查看/etc下的文件,作为more的操作对象
netstat -an | grep ESTABLISHED
查看计算机当前的服务器的连接。
grep
格式: grep [选项] ”搜索内容“ [文件]
选项:
-i:忽略大小写
-n:输出行号
-v:反向查找
–color=auto 搜索出的关键字用颜色显示
通配符
通配符 | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或任意多个字符 |
[] | 匹配括号中的任意一个字符 |
[-] | 匹配括号中的范围的任意一个字符,例:[a-z]匹配所有小写字母 |
[^] | 匹配不在括号中的任意一个字符,例:[ ^0-9]匹配所有除数字以外的字符。 |
特殊符号
符号 | 作用 |
---|---|
‘ ’ | 单引号。在单引号的所有特殊符号,如“$”、" ` "(反引号),都没有特殊含义 |
“ ” | 双引号。双引号中的特殊字符具有特殊含义,如"$"、"·"、“ $()” |
$() | 引用系统命令 |
· · | 反引号,引用系统命令 |
# | 注释 |
$ | 调用变量的值 |
\ | 转义字符 |
环境变量配置文件
系统环境变量配置文件
/etc/profile:系统第一个加载的配置文件
/etc/profile.d/*.sh
/etc/bashrc:系统配置别名的配置文件
参考:
https://blog.csdn.net/u011479200/article/details/86501366
环境变量
$PATH :系统查找命令的路径
例:ls,ls命令执行时,先去/home/hhh/bin下查找该命令,若没有则继续向后查找,查找完所有PATH路径之后还没有查找到命令,则报错。
(待更新)
HISTSIZE:指定history中存储的指令的数量,默认为100
位置变量参数
位置变量参数 | 作用 |
---|---|
$n | n为数字,$0代表命令本身,$1- 9 代 表 第 一 到 第 九 个 参 数 , 10 以 上 带 括 号 , 如 9代表第一到第九个参数,10以上带括号,如 9代表第一到第九个参数,10以上带括号,如{10} |
$* | 代表命令行中所有参数, $*把所以参数看做一个整体 |
$@ | 代表命令行中所有参数,$@把所以参数区别对待 |
$# | 代表命令行中所有参数的个数 |
例:
#!/bin/bash
# 测试位置参数变量
echo " 输入的命令:$0 "
echo " 第一个参数:$1 "
echo " 第二个参数:$2 "
echo " 第三个参数:$3"
echo " 输入的参数: $*"
#使用$*输出所有参数
echo " 输入的参数: $@"
#使用$@输出所有参数
echo " 输入的参数个数:$#"
测试:
区分
∗
和
*和
∗和@:
#!/bin/bash
#区分$*和$@
for i in "$*"
do
echo "输入的参数为: $i"
done
x=1
for y in "$@"
do
echo " 输入的第$x个参数为:$y"
x=$(($x+1))
done
输出结果,可以看到
∗
将
所
有
参
数
作
为
一
个
整
体
,
f
o
r
循
环
只
循
环
了
1
次
,
*将所有参数作为一个整体,for循环只循环了1次,
∗将所有参数作为一个整体,for循环只循环了1次,@则区别对待每一个参数,为每一个参数循环了一个。
预定义变量
预定义变量 | 作用 |
---|---|
$? | 返回上一条指令的执行结果,如果上一条命令执行正确,返回0,否则返回非0,具体数值由命令具体错误来指定 |
$$ | 当前进程的进程号PID |
$! | 后台运行的最后一个进程的进程号PID |
#!/bin/bash
# 测试进程号PID
echo "当前脚本的进程号:$$"
find ~/ -name test.sh &
# &代表后台执行
echo "后台运行的最后一个进程PID:$!"
测试结果:
接收键盘输入
read
格式: read [选项][变量名]
选项:
-p “提示信息” :在等待read输入时,输出提示信息
-t 秒数(以s为单位):指定等待时间
-n 字符数 :指定接收的字符数
-s :隐藏输入的数据
例:
#!/bin/bash
#test input
read -p "输入你的名字: " name
echo -e "\n"
echo "你输入的名字: $name"
read -s -t 20 -p "输入你的年龄:" age
echo -e "\n"
echo "你输入的年龄是: $age"
read -n 1 -p "输出你的性别(m/f): " sex
echo -e "\n"
echo "你输入的年龄是: $sex"
数值运算
declare:声明变量类型
格式: declare [+/-] [选项] 变量名
选项:
- :给变量设定类型属性
+:取消变量的类型属性
-i :将变量声明为整数型
-x :将变量声明为环境变量
-p :显示指定变量的被声明的类型
数值运算格式:$(())
例:
a=1
b=2
c= a + a+ a+b #c=1+2 原因时shell中默认类型为字符串类型
c= ( ( (( ((a+$b)) #c=3