定义
shell中有一些常用小技巧,干货总结,希望对初学者有一定帮助
演示
1.显示每步骤的执行过程,类似于debug
set -x 开启
set +x关闭
set -o 查看
2.传参使用
$0
当前脚本的文件名
$n
传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#
传递给脚本或函数的参数个数。
$*
传递给脚本或函数的所有参数,被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数
$@
传递给脚本或函数的所有参数。被双引号(" ")包含时,以"$1" "$2" … "$n" 的形式输出所有参数
$?
上个命令的退出状态,或函数的返回值。
$$
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
- |表达式,管道函数,他的功能是把第一个命令command 1执行的结果作为command2的输入传给command 2
如下命令,grep找出test.sh中的echo的数据,然后用wc -l来统计一共出现多少行
grep 'echo' test.sh | wc -l
-
&& 操作符,command1 成功后执行command2,否则不执行
command1 && command2 -
|| 操作符,command1执行失败的时候,command2才会被执行
command1 || command2 -
cut -d ':' -f 2 将内容以:分割,然后取第二部分
#如下,env中找出JAVA_HOME,随后,cut出=分割的第二部分
env |grep JAVA_HOME | cut -d "=" -f 2
结果
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/jre
7.数组拼接,array默认取第一个元素,做拼接时,如下
a="dd"
b="bc"
ay=(ds cc)
ay=($a $b ${ay[*]})
echo ${ay[*]}
- pushd、popd 使用,在两三个目录间频繁切换使用神器
/apps 加入堆栈
pushd /apps
此时,我的堆栈有如下两个目录
/apps /apps/apache-maven-3.3.9
多次执行pushd,就会在此两个目录来回切换,
执行popd弹出顶层目录,也可以指定目录弹出
- find 语法
#查找/目录下名字为 virtualbox.sh的文件
find / -name virtualbox.sh
#查找/目录下最深两层目录的,名字为 virtualbox.sh的文件
find / -maxdepth 2 -name virtualbox.sh
#在第二层子目录和第四层子目录之间查找passwd文件。
find / -mindepth 3 -maxdepth 5 -name passwd
- sed命令
#将t.sh 文件中的dd替换为nn,如果没有最后的g表示,只替换每一行的第一个匹配,-i插入数据-n整行操作
sed -in-place "s/dd/nn/g" t.sh
#第二行加入ddd
sed -in 2addd t.sh
#删除第二行
sed -in 2d t.sh
-
nl file 以行数展示文件数据
-
awk强大点文本编辑能力
#找到8080端口的进程号,利用awk -F的分割能力(-F " "此处可以省略,默认值)
ps -ef|grep 8080 |grep tomcat |awk -F " " '{ print $2}'
- 判断字符串是否为空
#-z判断是否为空
-z "$d"
#拼接x判断是否为空
"x$JRE_HOME" = "x"
- 获取输出的第几行或第几列
#awk '{print $5}' 获取第5列
#sed -n '2p' 获取第二行
ls -l | awk '{print $5}' | sed -n '2p'
15 类似java的三元运算符
${var:-string},${var:+string},${var:=string},${var:?string}
①${var:-string}和${var:=string}:若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string};对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var: ${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。
② ${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)
③${var:?string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。
补充扩展:在上面这五种替换结构中string不一定是常值的,可用另外一个变量的值或是一种命令的输出。
15 、判断文件表达式
-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ]
16 ps查看线程信息
[ci@VM_0_14_centos ~]$ ps -ef | grep tomcat
[ci@VM_0_14_centos ~]$ ps -p 3346 -L
PID LWP TTY TIME CMD
3346 3346 ? 00:00:00 java
3346 3347 ? 00:00:00 java
3346 3348 ? 00:00:00 java
3346 3349 ? 00:00:00 java
3346 3350 ? 00:01:25 java
3346 3351 ? 00:02:01 java
3346 3352 ? 00:00:00 java
3346 3353 ? 00:00:00 java
3346 3354 ? 00:00:00 java
3346 3355 ? 00:00:00 java
3346 3356 ? 00:00:40 java
3346 3357 ? 00:00:24 java
3346 3358 ? 00:00:00 java
3346 3359 ? 00:00:00 java
3346 3360 ? 00:42:48 java
3346 3385 ? 00:00:00 java
3346 3395 ? 00:00:00 java
3346 3396 ? 00:00:00 java
3346 3397 ? 00:00:00 java
17 查看实时进程信息
watch -n 1 'ps -e -o pid,uname,cmd,pmem,pcpu --sort=-pmem,-pcpu | head -15'
18 按性能消耗进程排序
ps aux --sort=-pcpu,+pmem
网友评论