1. 搭配命令
- Linux命令常用符号
符号类型 | 使用命令 | 解释说明 |
` | `ls` | 倒引号内命令表示输出 Linux 命令 |
* | ls *.sh | * 表示模糊匹配,*在前表示查询以 .sh结尾的文件/目录,后面反之 |
- | cd - | 表示返回上次所在路径 |
/ | cd / | 进入根目录 |
./ | 表示当前目录(复制文件到当前目录 cp xxx ./) | |
./ xxx.sh | 执行 xxx.sh 文件(xxx.sh 需要可执行权限) | |
& | sleep 5 & | & 表示某个命令后台执行(jobs 可调出后台ID) |
| | cat file |grep 'a' | | 表示上一个命令的输出作为下一个命令的输入(过滤条件很好用) |
> | echo > file | > 表示覆盖(echo 输出为空,将这个空值覆盖到 file,相当于清空文件) |
echo 'a' >> file | >> 表示追加,将字符串 a 追加到 file | |
! | !! | 执行上一个命令 |
!p | 执行上一次以p开头的命令 | |
!20 | 执行历史命令编号为20的命令(使用 history 查看编号) |
2. shell类型
2.1. 注释
单行注释
以井号开头
# 注释内容xxx
多行注释
以 << 开头 + 开始语,最后以开头语一样的字符结尾
<<EOF
注释内容1
注释内容2
注释内容3
EOF
vim 命令多行注释
# 末行模式 - 注释整个文件
:%s/^/#/
# 末行模式 - 注释指定行(3-5行)
:3,5s/^/#/
# 命令模式 - 选中注释
1、光标移动到指定行
2、Ctrl + v
3、上下键选中指定行
4、按下大写 I 键
5、按下井号键 #
6、按下ESC退出键
2.2. $符号
- 包含变量名、脚本名、位置参数
符号 | 解释 |
$$ | 表示当前脚本 PID |
$* | 表示所有的位置参数 |
$@ | 表示所有的位置参数 |
$# | 表示参数个数 |
$? | 返回上一个指令的状态(0表示正常,其他数字表示异常) |
$0 | 表示当前脚本名 |
$1 | 表示第1个位置参数 |
$2 | 表示第2个位置参数 |
$n | 表示第n个位置参数 |
符号 | 解释 |
$USER | 当前用户的用户名 |
$HOME | 当前用户的主目录 |
$PWD | 当前工作目录的绝对路径 |
$OLDPWD | 上一个工作目录的绝对路径 |
$HOSTNAME | 当前主机的主机名 |
$SECONDS | Shell启动后的秒数 |
$RANDOM | 一个随机数 |
$LINENO | 当前代码行的行号 |
$IFS | 输入分隔符 |
$PS1 | 主提示符的字符串 |
$PS2 | 次提示符的字符串 |
2.3. 小括号
表示命令
# $() 表示输出命令,等同于反引号``
df -h $(pwd) # 命令中套用命令
# 获取绝对路径的目录(不包含文件)
dirname [路径]
# 获取路径下文件名
basename [路径]
# 获取当前脚本的上层绝对路径
echo `cd $(dirname ${BASH_SOURCE}); pwd`
# 将三个命令看做一个大整体,那么括号中视为一个小整体
command1 (command2 command3)
表示数组
# 顺序索引添加数组
arr=(a1 a2 a3) # 默认索引从0开始,以空格分隔
# 指定索引添加数组
arr=([1]="a1" [4]="a4")
# 替换/添加指定的索引
arr[1]="arr1" # 将索引为 1 的值替换为 arr1,若原索引1为空,那么直接添加
# 拼接两个数组
arr1=(a1 b1) arr2=(a2 b2)
arr3=(${arr1[@]} ${arr2[1]}) # arr1 全部 + arr2 索引 1
echo ${arr3[@]} # a1 b1 b2
# 删除数组
unset arr1[0] # 将 arr1 索引为 0 的值删除
# 输出数组
echo ${arr} # 输出第一个数组
echo ${arr[0]} # 输出第一个数组
echo ${arr[1]} # 输出第二个数组
echo ${arr[@]} # 输出全部数组
echo ${#arr[@]} # 输出数组的个数
# 数组排序
arr=(1 342 23 54)
arr=$(echo ${arr[@]} |xargs -n 1 |sort -n|xargs) # 升序
arr=$(echo ${arr[@]} |xargs -n 1 |sort -nr|xargs) # 降序
表示计算器
计算两个值
echo $(( 1 + 1 )) # 2
计算两个变量相加的值
a=2
b=3
echo $(( a + b )) # 5
注意:这种方式无法计算浮点数,系统会直接省略,可以使用 echo + bc 命令
指定浮点数位数:scale
echo "scale=2; 10 / 3" |bc # 3.33
echo "scale=2; 1 + 1.234" |bc # 2.234 浮点数相加无法指定
表示循环
# for 循环
for (( i=1; i<10; i+=1 ));do
echo $i
done
# 加法
w=0
while [ ${w} -le 10 ] ;do
echo ${w}
(( w += 1 ))
done
2.4. 中括号
表示计算器
计算两个值
echo $[ 1 + 1 ] # 2
计算两个变量相加的值
a=2
b=3
echo $[ a + b ] # 5
注意:这种方式无法计算浮点数,系统会直接省略,可以使用 echo + bc 命令
指定浮点数位数:scale
echo "scale=2; 10 / 3" |bc # 3.33
echo "scale=2; 1 + 1.234" |bc # 2.234 浮点数相加无法指定
if 判断语句
********************** 逻辑符判断 **************************
判断:真
[ -f /data ] && echo "如果有 /data 这个文件,那么输出这段字符串"
判断:假
[ ! -f /data ] && echo "如果没有 /data 这个文件,那么输出这段字符串"
合理利用逻辑操作符:&& 输出真,|| 输出假
[ -f /data ] && echo "这个文件存在" || echo "这个文件不存在"
********************** if 语句判断 ************************
判断上一个指令是否正常
if [ $? -eq 0 ]; then
echo "上一个指令输出正常"
else
echo "上一个指令输出异常, 退出程序"
exit 1
fi
判断多个指令:-a 表示逻辑与(and)
if [ f1 -eq 1 -a f2 -eq 2 ]; then
echo "f1=1,f2=2 必须满足两个条件即可"
else
echo "不满足两个条件"
fi
判断多个指令:-o 表示逻辑或(or)
if [ f1 -eq 1 -o f2 -eq 2 ]; then
echo "f1=1,f2=2 满足其中一个条件即可"
else
echo "不满足两个条件"
fi
********** 逻辑比较参数 **********
Usage:[ 1 -eq 1 -a 2 -eq 2 ]
-a:逻辑与(and)
-o:逻辑或(or)
********** 数学比较参数 **********
Usage:[ 1 -eq 1 ]
-gt :大于
-eq:等于
-lt :小于
-ne:不等于
-ge:大于等于
-le :小于等于
********** 字符串比较参数 ********
Usage:[ "string" == "string" ]
==:等于
!=:不等于
********** 文件比较与检查 ********
Usage:[ -f file.txt ]
-f:判断文件存在
-d:判断目录存在
-e:判断文件或目录存在
-z:判断字符串为空
-n:判断字符串不为空
-r:判断文件为可读
-w:判断文件为可写
-x:判断文件为可执行
-s:判断文件存在,且不为空
-O:判断文件存在,且被当前用户拥有
-G:判断文件存在,且默认组为当前用户组
file1 -nt file2:判断文件 file1 比 file2 新
file1 -ot file2:判断文件 file1 比 file2 旧
双括号判断
判断变量是否为空
[[ ! ${var} ]] && echo "变量 var 为空"
数据运算判断 >、=、<、!=、>=、<=
if [[ ${a} > 1 ]]; then
echo "变量 a 大于 1"
else
echo "变量 a 不大于 1"
fi
字符串判断
if [[ "${var}" == "string" ]]; then
echo "变量 var 等于 string"
else
echo "变量 var 不等于 string"
fi
逻辑判断:&& 与、|| 或、!非
[[ 1=1 && 2=2 && 3=3 ]] && echo "需要满足全部条件"
[[ 1=1 || 2=1 || 3=1 ]] && echo "满足其中一个条件即可"
[[ ! 1=1 ]] && 1 不等于 1(取反)
2.5. 大括号
接收变量/数组
符号 | 解释 |
${var} | 表示接收的变量(标准写法),也可以写 $var |
${a[1]} | 输出数组 a 索引为 1 的值 |
${a[-1]} | 输出数组 a 最后1个值,-2 表示倒数第2个 |
${a[@]} | 输出全部数组 |
${#a[@]} | 输出数组的个数 |
${#a[0]} | 输出数组索引为0的字符长度 |
${a[@]:2:6} | 输出数组索引为 2 后面的 6 个值 |
${a[@]::3} | 输出数组索引为 3 之前的值(0,1,2) |
${a[@]:$((pos + 2))} | 输出索引为 2 后面的所有值(包含索引2) |
指定分隔符截取字符串
符号 | 解释 |
${a#*/} | 指定分隔符为 /,不显示第一列 |
${a##*/} | 指定分隔符为 /,只显示最后1列 |
${a%/*} | 指定分隔符为 /,不显示最后一列 |
${a%%/*} | 指定分隔符为 /,只显示第一列 |
示例:a=1/2/3/4/5
echo ${a#*/} # 2/3/4/5
echo ${a##*/} # 5
echo ${a%/*} # 1/2/3/4
echo ${a%%/*} # 1
指定索引截取字符串
符号 | 解释 |
${a:1} | 截取字符串索引为1开始,后面全部 |
${a:1:2} | 截取字符串索引为1开始,后面 2 个 |
${a:0-1} | 截取字符串最后1个 |
${a:0-2} | 截取字符串最后2个 |
${a:0-5:3} | 0-5获取最后5个,:3 从5个值中从左到右截取3个 |
判断变量是否为空
符号 | 解释 |
${a:-'1'} | 如果变量 a 为空,那么返回1(1可以为任意字符串) |
${a:='1'} | 如果变量 a 为空,那么给a赋值为1(1可以为任意字符串) |
${a:?'error'} | 如果变量 a 为空,那么退出程序,输出字符串 error(error 可以为任意字符串) |
2.4. 引号
单引号:单引号内的任意字样都会被原样输出,无法使用变量、转译等操作
双引号:双引号内可以使用变量、转译、通配符
反引号:输出命令 (同 $() 一样)
2.5. 正则表达式符号
- Linux 目前3个命令支持正则:grep、awk、sed
字符 | 解释 | 用法 |
^ | 匹配以什么开始 | grep -E '^ab' 匹配以ab开头的行 |
$ | 匹配以什么结尾 | grep -E 'ab$' 匹配以ab结尾的行 |
. | 匹配任意一个字符 | grep -E 'a.c' 只匹配a与c之间拥有一个字符的行 |
.+ | 匹配1次或多次 | grep -E 'a.+c' 匹配a与c之间任意字符的行,不包含ac |
* | 匹配0次或多次 | grep -E 'a*c' 匹配a与c之间任意字符的行,包含ac |
| | 相当于 or | grep -E 'ab|ac' 匹配包含ab或ac的行 |
[] | 匹配括号中任意一个字符 | grep -E '[ac]' 匹配包含a或c的行 |
[^] | 匹配非括号中任意一个字符 | grep -E '[^ac]' 匹配不包含a或c的行 |
- | [0-9] 匹配数字 | grep -E [0-9] 匹配包含数字的行 |
[^0-9] 匹配非数字 | grep -E [^0-9] 匹配不包含数字的行 | |
[a-z] 匹配小写字符串 | grep -E [a-z] 匹配包含小写字符串的行 | |
[^a-z] 匹配非小写字符串 | grep -E [^a-z] 匹配不包含小写字符串的行 | |
[A-Z] 匹配大写字符串 | grep -E [A-Z] 匹配包含大写字符串的行 | |
[^A-Z] 匹配非大写字符串 | grep -E [^A-Z] 匹配不包含大写字符串的行 | |
() | (a|b) 匹配括号中任意字符 | grep -E '0(a|b)1' 只匹配0a1和0b1的行 |
(a)+ 匹配包含1个或多个a | grep -E '0(a)+1' 匹配0和1之前1个或多个a,0a1、0aa1... | |
{} | {n} 指定匹配n个以上 | grep -E 'ab{2}' 匹配包含ab,且a或b连续为2次以上:abb |
{n,m} 指定匹配 n-m 个 | grep -E 'ab{2,3}' 匹配包含ab,且a或b连续为2-3次:abb、aaab |
2.6. 其他符号
符号 | 解释 |
\ | 转译字符,以下常用 3 个作用:
1、将特殊符号转译为普通符号:\$、\[、\*、\\ 2、某些命令特殊定义:\n 换行、\t 缩进、\r 回车 3、连接多个命令:用于shell格式调整(命令过长使用 \ 符号,下一行命令延续上一行命令) |
: | 表示什么也不做,相当于占位符 |
; | 表示将命令分开(例如: ls aaa; ls bbb 执行完成第一个命令后继续执行第二命令) |
;; | 用于 case 命令专属 |
3. Linux 后缀名
类型 | 后缀 | 解释 |
脚本文件 | .sh | shell 文件 |
.py | python 文件 | |
.jar | java 文件 | |
.c | c 语言文件 | |
.cpp | c++ 文件 | |
.h | c 或 c++ 头部文件 | |
.o | 程序目标文件 | |
.php | php 文件 | |
.tcl | tcl 文件 | |
.exp | 交互命令 expect 文件 | |
系统文件 | .so | 库文件 |
.rpm | rpm 包 | |
压缩包 | .tar | tar 包 |
.zip | zip 包 | |
.tar.gz | gzip 包 | |
应用文件 | .conf | 配置文件 |
.sql | sql 文件 | |
普通文件 | .html | html 文件 |
.txt | 文本文件 | |
图像文件 | .gif | GIF 图像文件 |
.png | PNG 图像文件 | |
.xpm | XPM 图像文件 |
文章评论