美文网首页程序员
Shell 常用代码片段

Shell 常用代码片段

作者: AlienPaul | 来源:发表于2020-11-25 18:08 被阅读0次

获取脚本运行目录

CURRENT_DIR=$(
  cd $(dirname $0)
  pwd
)

或者

CURRENT_DIR="$(dirname $0)"

解析:
dirname命令接受一个文件路径作为参数,返回该路径对应的目录路径。例如我们执行:

dirname /path/to/my.c

返回的结果为:

/path/to

还有一个命令为basename。接受参数一样,但是返回路径中对应的文件名。例如执行:

basename /path/to/my.c

返回的结果为:

my.c

检测某个命令是否存在

command_exists() {
  type $1 >/dev/null
}

解析:
type命令的作用为显示命令的类型。默认不加参数的输出为人类可读的英文句子。

可以使用-t参数,只输出命令的类型,使用一个单词来表示。
命令的类型有如下几种:

  • alias:别名
  • keyword:关键字
  • function:函数
  • builtin:内建命令
  • file:文件或外部命令
  • unfound:未找到

检测某个进程是否在运行

if kill -0 $pid >/dev/null 2>&1;then
# ...
else
# ...
fi

解析:
kill 命令用于向进程发送信号(SIGNAL),常用于终止进程运行(优雅停止和暴力停止)。
0这个信号比较特殊,查看kill命令的帮助文档解释如下:

If sig is 0, then no signal is sent, but error checking is still performed; this
can be used to check for the existence of a process ID or process group ID.

0意味着不发送任何信号,但是仍会进行错误检查。可用于检查PID对应的进程是否在运行。

后台启动程序并返回进程号

run_process_background() {
    nohup $1 >/dev/null 2>&1 &
    pid=$!
}

将shell用到的方法抽取到独立文件

例如我们将脚本包含的方法抽取到functions.sh,可以这么操作:

functions.sh文件:

demo() {
  echo 'Invoke some function'
}

main.sh中需要使用functions.shdemo方法,我们可以这么写:

. ./functions.sh

demo

解析:

.(点)命令和source命令相同,在同一个shell中执行脚本。当然,被调用脚本的变量等信息会反应到当前shell中。和C语言的#include或者PHP的require作用类似。

打印彩色文字

echo -e "\033[32m 绿色 \033[0m"

其中\033[32m代表它之后的文本以绿色显示。\033[0m表示它之后的文本显示效果恢复默认。

总结一下,表示颜色的代码格式为:\033[xm,其中x为特效代码。

相关特效代码整理如下:

   编码 颜色/动作
  0   重新设置属性到缺省设置
  1   设置粗体
  2   设置一半亮度(模拟彩色显示器的颜色)
  4   设置下划线(模拟彩色显示器的颜色)
  5   设置闪烁
  7   设置反向图象
  22 设置一般密度
  24 关闭下划线
  25 关闭闪烁
  27 关闭反向图象
  30 设置黑色前景
  31 设置红色前景
  32 设置绿色前景
  33 设置棕色前景
  34 设置蓝色前景
  35 设置紫色前景
  36 设置青色前景
  37 设置白色前景
  38 在缺省的前景颜色上设置下划线
  39 在缺省的前景颜色上关闭下划线
  40 设置黑色背景
  41 设置红色背景
  42 设置绿色背景
  43 设置棕色背景
  44 设置蓝色背景
  45 设置紫色背景
  46 设置青色背景
  47 设置白色背景
  49 设置缺省黑色背景

颜色代码整理来源:shell脚本输出带颜色字体

打印旋转线

可用作执行持续时间较久的任务时候打印一个持续“旋转”的直线。代码如下:

spin() {
    local i=0
    local sp='/-\|'
    local n=${#sp}
    printf ' '
    sleep 0.1
    while true; do
        printf '[%s]\b\b\b' "${sp:i++%n:1}"
        sleep 0.1
    done
}

解析:
while循环中的${sp:i++%n:1}表示每次打印sp字符串中的一个字符,打印完最后一个就从头开始(对i++取模运算,n为字符串sp的长度)。printf指令后的\b表示退格(backspace)。每次打印完旋转线后退3个字符,下次while循环的时候就会覆盖掉之前的字符,从而实现“旋转”的效果。

一个例子:我们编写一个脚本progress.sh,实现后台执行耗时较长命令,同时显示旋转线作为提示,命令执行完毕后打印绿色的Success字样。
progress.sh命令运行的格式为:

./progress.sh "命令" "提示语"

比如我们这么使用:

./progress.sh "sh workload.sh" Downloading:

workload.sh是一个耗时较长的命令,我们用sleep来模拟:

#!/bin/bash

echo 'Working'
sleep 3
echo 'Finished'

该命令执行后会显示

Downloading: [\]

旋转线提示符。workerload.sh执行完返回后会显示:

Downloading: [Success]

其中Success为绿色显示。

下面放出代码:

#!/bin/bash

run_process_background() {
    nohup $1 >/dev/null 2>&1 &
    pid=$!
}

spin() {
    local hint=$1
    local i=0
    local sp='/-\|'
    local n=${#sp}
    sleep 0.1
    printf '%s' "${hint} "
    while kill -0 $pid >/dev/null 2>&1; do
        printf '[%s]\b\b\b' "${sp:i++%n:1}"
        sleep 0.1
    done
    printf '[\033[32m%s\033[0m]' "Success"
}

run_process_background "$1"
spin "$2"

相关文章

  • Shell 常用代码片段

    获取脚本运行目录 或者 解析:dirname命令接受一个文件路径作为参数,返回该路径对应的目录路径。例如我们执行:...

  • java中shell调用

    java中调用shell代码片段

  • PHPStorm快捷键1

    常用代码片段 CTRL + j能够快捷的输入常用的代码片段,类似vim的 snipMate,可以自定义代码片段 类...

  • shell-01

    shell片段1 shell片段2 shell片段3

  • 常用代码片段

    常用宏 等比例缩放

  • 常用代码片段

    phpstorm中也有快速输出常用代码的简写,设置地方如下:

  • 常用代码片段

    1.控制台输入 2.合并数组

  • 常用代码片段

    View 特效 半边圆角 渐变

  • shell常用代码

    1、免密执行安装插件 2、为空判断 3、遍历文件获取文件名文件名称不能带有空格,有空格会获取空格后的名字,现已处理...

  • Vue3 常用代码片段

    1、 Vue3 常用代码片段 snippets: 日常开发中常用的代码片段及组件封装集合[https://gith...

网友评论

    本文标题:Shell 常用代码片段

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