工作中常用的 Shell 命令及技巧
调试 bash 脚本的技巧
- 加
-x参数运行 bash 脚本时,会显示执行的语句
# 也可以在 demo.sh 中加上 set -x
bash -x demo.sh
- 设置环境变量,然后通过如上方式运行脚本时,会显示行号
export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
参考
快速输入历史命令
输入关键词之后,连续使用ctrl+r快速切换
- In reverse-i-search (Ctrl+R ) ,Any method to switch between similar commands in history
- linux – 在反向搜索(Ctrl R),任何在历史记录中类似命令之间切换的方法
Ctrl+p/n 向上/向下 显示缓存命令
ssh远程执行命令
需要远程到其他节点上执行一些 shell 命令,示例:
#! /bin/sh
set -x
ssh root@192.168.3.43 > /dev/null 2>&1 << EOF
cd /tmp
touch test.txt
exit
EOF
echo done
参考:
for循环
echo "Start Datetime:" $(date +"%Y-%m-%d %H:%M:%S")
for i in {1..3}
do
echo $i
git pull --all
if [ $? -ne 0 ]
then
echo "不成功"
# 睡眠2s
sleep 2
else
break
fi
done
echo "End Datetime:" $(date +"%Y-%m-%d %H:%M:%S")
参考:
if 判断
判读字符串(\(str)是否包含另一个字符串(\)str1):
方法1:
if [ `echo $str | grep -e '$str1'` ] ; then
echo yes
fi
方法2(如果$str1在判断中直接使用字符串而不是变量,则不能加引号,如if [[ $str =~ ^dx ]]判读字符串$str是否以dx开头,^dx不能加引号):
if [[ $str =~ $str1 ]] ; then
echo yes
fi
比较两个字符串是否相等的办法是:
if [ "$test"x = "test"x ]; then
这里的关键有几点:
- 使用单个等号,我发现,2个等号也 OK;
- 注意到等号两边各有一个空格:这是unix shell的要求
- 注意到
"$test"x最后的x,这是特意安排的,因为当$test为空的时候,上面的表达式就变成了x = testx,显然是不相等的。而如果没有这个x,表达式就会报错:[: =: unary operator expected
参考:
从URL截取字段
默认去除url的最后斜线:
url=http://xxx/patch/xxx/xxxx/
tar_name=$(echo ${url%*/}|awk -F '/' '{print $NF}')
shell判断字符串包含
if [[ $tar =~ tar.gz ]];then echo "包含";fi
Bash 加 -xe 表示什么意思
-e 使shell立即退出,某些东西会返回一个错误(这通常在shell脚本中用作故障保护机制),
-x 允许详细执行脚本,你可以看到发生了什么
Shell 中的引号
https://blog.csdn.net/miyatang/article/details/8077123
Shell定义变量和给变量赋值
将命令的执行结果赋值给变量:
var='pwd'
# 或者
var=$(pwd)
将 Bash 的内置命令 read 读入的内容赋值给变量:
echo -n "Enter var:";read var
通配符与特殊符号
| 符号 | 意义 |
|---|---|
| * | 代表0个到无穷多个任意字符 |
| ? | 代表一定有一个任意字符 |
| [] | 同样是代表一定有一个在中括号内的字符(非任意字符)。例如,[abcd]代表一定有一个字符,可能是这四个中的一个 |
| [-] | 若减号在括号内,代表在编码顺序内的所有字符。例如,[0-9]代表0-9之间所有数字,因为数字的语系编码是连续的 |
| [^] | 若中括号第一个字符是^,表示原向选择,例如[^abc]代表一定有一个字符,只要是非a,b,c的其他字符就接收 |
示例:
- 找出
/etc/目录下文件夹名字刚好有5个字母的文件名:ll -d /etc/????? - 找出
/etc/下面文件名含有数字的的文件名:ll -d /etc/*[0-9]* - 找出
/etc/下面文件名开头非小写字母的文件名:ll -d /etc/[^a-z]* - 将上面例子找到的文件复制到
/tmp中:`
bash 中的特殊符号
| 符号 | 内容 |
|---|---|
| # | 注释符号 |
| \ | 转义符号,将特殊字符或通配符还原成一般字符 |
| 竖线 | 管道 |
| ; | 连续命令执行分隔符,连续命令的界定 |
| ~ | 用户的主文件夹 |
| $ | 使用变量的前导符 |
| & | 作业控制,将命令变成背景下工作 |
| ! | 逻辑运算意义上的“非” |
| >,>> | 数据流重定向,输出导向,分别是“替换”与“累加” |
| <,<< | 数据流重定向,输入导向 |
| '' | 单引号,不具有变量置换的功能 |
| "" | 具有变量置换的功能 |
| `` | 两个重音符中间为可以先执行的命令,也可以使用$() |
| () | 中间为子shell的起始与结束 |
| {} | 中间为命令块的组合 |
给Linux新增硬盘之后的操作
fdisk -l #查看磁盘情况,发现有磁盘没有分区,比如是/dev/xvde
fdisk /dev/xvde #进行磁盘分区的操作
fdisk磁盘分区时,可以输入m,会有提示:
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
我依次这么输入的:
add a new partition:n
partion type:p
Partion number:分区个数 1
First sector默认值:Enter
Lase sector默认值:Enter
print the partion table:p
write table to disk and exit:w
分区完成之后,需要格式化
mkfs -t ext4 /dev/xvde1
将新建分区挂载到/data目录下:
mkdir /data
mount /dev/xvde /data
挂载完毕,输入df -hT可以查看到新建的分区
设置文件系统的自动挂载
vi /etc/fstab
添加/dev/xvde1 /data ext4 defaults 0 1
在 fstab 配置文件中加入挂载点之后其实就已经是开机自动挂载了,不需要用 mount 命令挂载。但是还是用 mount 实在,因为最后还是需要写入/etc/fstab
第一段可以用分区名,也可以用 blkid 的方式获取 UUID 的值
参考:
- www.jianshu.com/p/7b8c3509d5fe
- 玩转 Linux 之:磁盘分区、挂载知多少?
- LVM
- Linux 磁盘管理
备份原有配置文件
只将不带注释的内容提取出来,作为配置文件
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
-v 参数表示反选
修改主机名
查看Linux系统版本
lsb_release -a # 适用于所有Linux系统
cat /etc/os-release #推荐
cat /etc/redhat-release # 仅适用于Redhat系列的Linux系统
uname -a # 查看Linux内核
cat /proc/version # 查看Linux内核
显示 shell 执行过程
set -x
如果想隐藏某一行的内容:
set -x
xxxx
set +x
yyyy
set -x
查看端口占用
[root@centos7.4 software]# netstat -apn 查看当前运行的所有进程的端口使用情况
[root@centos7.4 software]# netstat -apn | grep 端口号 查看指定端口使用情况
[root@centos7.4 software]# kill 指定端口的pid号 杀死指定进程(端口号对应的pid)
打印第X行
head -n X | tail -n 1
显示 Path 环境变量
显示你的环境变量PATH,一个目录一行:
echo $PATH | tr : \\n
atime mtime ctime 的含义
- atime (access time) 访问时间,表示文件最后被访问的时间;
- mtime (modify time) 修改时间,文件内容被修改的最后时间,平常我们
ls -l查看文件是,显示的就是 mtime; - ctime (change time) 变化时间,文件的元数据发生变化的时间,例如权限、所有者等,通俗来讲,就是文件属性或文件位置改动的时间;
利用 stat file_name 可以查看文件 「amc」time 。
echo "hello" >> issue
写文件操作(>> 方式)不会导致 atime(访问时间)的修改,但是 mtime 和 ctime 会发生修改。mtime 修改了我们可以理解的,毕竟我们修改了文件的,
那为何ctime也修改了呢, 仔细可以发现我们文件的大小发生了变化,也就是元数据发生了变化,所以ctime也是要变化的
参考:
重定向相关
FAQ
Q:Linux各目录的作用
Q:http://blog.csdn.net/u011109356/article/details/54928955
/dev/xvda1 占满
Linux好文
最后
- 本文作者: Michael翔
- 本文链接: https://michael728.github.io/2019/04/14/linux-useful-shell-commands-in-work/

工作中常用的 Shell 命令及技巧的更多相关文章
- 工作中常用的Linux命令:crontab命令
本文链接:http://www.cnblogs.com/MartinChentf/p/6060252.html (转载请注明出处) crontab是一个用来设置.删除或显示供守护进程cron执行的定时 ...
- 工作中常用的Linux命令:mkdir命令
本文链接:http://www.cnblogs.com/MartinChentf/p/6076075.html (转载请注明出处) 在Linux系统中,mkdir命令用来创建一个目录或一个级联目录. ...
- 工作中常用的Linux命令:ipcs/ipcrm命令
本文链接:http://www.cnblogs.com/MartinChentf/p/6057100.html (转载请注明出处) ipcs 1. 命令格式 ipcs [resource-option ...
- 工作中常用的Linux命令:find命令
本文链接:http://www.cnblogs.com/MartinChentf/p/6056571.html (转载请注明出处) 1.命令格式 find [-H] [-L] [-P] [-D deb ...
- 安卓日常开发和逆向中常用的shell命令与非shell命令
简述shell 命令与 非shell命令区别 shell命令不用先adb shell进入界面执行 非shell命令必须要 adb shell进入界面执行 基础非shell命令 1.安装app adb ...
- 【基础】工作中常用的linux命令,经常会被面试官问到
前言 面试经常会问到一些Linux操作命令,下面就工作中常用的和面试问的频率较高的命令做详细描述. 常用命令 修改密码:passwd 用户名 切换用户名:su 用户名 查看当前路径:pwd 调整路径: ...
- 工作中常用的Linux命令介绍与实践
前言 做后端开发的同学,一般都会接触到服务器,而我们现在的系统用的比较多的服务器系统就是linux了,平时多多少少也会接触到一些linux下的shell命令.我们来介绍下linux一些常用的命令和使用 ...
- 在工作中常用的Linux命令
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 之前写过一篇 < 在公司做的项目和自己在学校做 ...
- 工作中常用的Linux命令
1.从其他机器拷贝文件夹 格式: scp -r 文件夹名 用户名@机器名:/路径 范例: scp -rsearch work@zjm-testing-ps23.zjm.baidu.com:/home/ ...
随机推荐
- VisualStudioCode创建的asp.net core项目部署到linux,使用nginx代理
1.准备工作: a:使用VisualStudioCode创建asp.net core项目,并使用命令“dotnet publish”发布(可以参考前面两篇文章). 如:dotnet publish - ...
- __add__,关于运算符重载(用户权限)
1.首先定义三种用户类型:普通用户.管理员.超级管理员,不同用户类型的用户权限关系如下: 先看一段代码: class Scope(): # 定义一个基类,因为每个权限类都需要add()方法 allow ...
- Linux 下如何修改用户名(同时修改用户组名和家目录)
有时候,由于某些原因,我们可能会需要重命名用户名.我们可以很容易地修改用户名以及对应的家目录和 UID.-- Shusain 本文导航◈ 修改用户名12%◈ 修改家目录43%◈ 更改用户 UID52% ...
- jquery-ui sortable 在拖动换位置时改变元素的大小导致占位与实际不一致
使用jquery ui sortable时 需求是在拖动的时候要隐藏一部分元素,然后按照隐藏后的元素高度换位, 解决方案是修改源码jquery-ui.js, _mouseStart方法中开头增加 if ...
- ORACLE——EXTRACT() 截取日期时间的函数使用
1.截取日期的 年: --使用方法 EXTRACT(YEAR FROM DATE) SQL> SELECT EXTRACT( YEAR FROM SYSDATE ) FROM DUAL; --结 ...
- linux c tcp p2p
江湖上一直都有这位哥哥的传说,也有很多人说自己就他的真身! 但是... 今天分享一下TCP连接的P2P demo,江湖的规矩也要与时俱进... ———————————————————————————— ...
- java代码审计中的一些常见漏洞及其特征函数
文章来源:https://xz.aliyun.com/t/1633 最近在先知上看到之前有篇关于java代码审计的文章总结的蛮好,记录以下特征函数,方便查阅,同时自己也会将在平时代码审计过程中积累的函 ...
- iframe子页面与父页面元素的访问以及js变量的访问
1.子页面访问父页面元素 parent.document.getElementById('id')和document相关的方法都可以这样用 2.父页面访问子页面元素 document.getEle ...
- Linux环境上部署Flask
[该文章只涉及个人部署的简单流程,读者可通过其它途径了解详细部署流程] 依个人部署项目可预先安装好需要的环境,这里已提前安装好LNMP环境 1.安装Python环境 安装virtualenv环境 配置 ...
- 【论文速读】Shitala Prasad_ECCV2018】Using Object Information for Spotting Text
Shitala Prasad_ECCV2018]Using Object Information for Spotting Text 作者和代码 关键词 文字检测.水平文本.FasterRCNN.xy ...