美文网首页
linux shell编程学习--常用技巧

linux shell编程学习--常用技巧

作者: 爱编程的凯哥 | 来源:发表于2018-12-17 21:40 被阅读4次

定义

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。
  1. |表达式,管道函数,他的功能是把第一个命令command 1执行的结果作为command2的输入传给command 2

如下命令,grep找出test.sh中的echo的数据,然后用wc -l来统计一共出现多少行

grep 'echo' test.sh | wc -l

  1. && 操作符,command1 成功后执行command2,否则不执行
    command1 && command2

  2. || 操作符,command1执行失败的时候,command2才会被执行
    command1 || command2

  3. 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[*]表示数组所有变量,array默认取第一个元素,做拼接时,如下

a="dd"
b="bc"
ay=(ds cc)
ay=($a $b ${ay[*]})
echo ${ay[*]}
  1. pushd、popd 使用,在两三个目录间频繁切换使用神器
 /apps 加入堆栈
 pushd  /apps
此时,我的堆栈有如下两个目录
/apps  /apps/apache-maven-3.3.9
多次执行pushd,就会在此两个目录来回切换,
执行popd弹出顶层目录,也可以指定目录弹出
  1. find 语法
#查找/目录下名字为 virtualbox.sh的文件
find / -name virtualbox.sh  
#查找/目录下最深两层目录的,名字为 virtualbox.sh的文件
find / -maxdepth 2 -name virtualbox.sh
#在第二层子目录和第四层子目录之间查找passwd文件。
find / -mindepth 3 -maxdepth 5 -name passwd
  1. 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
  1. nl file 以行数展示文件数据

  2. awk强大点文本编辑能力

#找到8080端口的进程号,利用awk -F的分割能力(-F " "此处可以省略,默认值)
ps -ef|grep 8080 |grep tomcat |awk -F " " '{ print $2}'


  1. 判断字符串是否为空
  #-z判断是否为空
  -z "$d"

  #拼接x判断是否为空
  "x$JRE_HOME" = "x" 
  1. 获取输出的第几行或第几列
#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

相关文章

网友评论

      本文标题:linux shell编程学习--常用技巧

      本文链接:https://www.haomeiwen.com/subject/gemtkqtx.html