0%

shell脚本常用命令总结

bash写shell脚本常用的一些命令总结

QQ群:397745473

让代码颜色丰富

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#######color code########
RED="31m"
GREEN="32m"
YELLOW="33m"
BLUE="36m"
FUCHSIA="35m"

colorEcho(){
COLOR=$1
echo -e "\033[${COLOR}${@:2}\033[0m"
}

使用示例:
colorEcho $YELLOW "Please run this script on x86_64 machine."

参考: https://raw.githubusercontent.com/Jrohy/trojan/master/install.sh

通常调用一键远程脚本的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
source <(curl -sL https://git.io/trojan-install)

wget --no-check-certificate -qO AutoDD.sh 'http://git.io/autodd.sh' && bash AutoDD.sh

wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh

bash <(curl -s -L https://git.io/v2ray.sh)

bash <(curl -L -s -k "https://git.io/Jvc36")
-k 允许curl使用非安全的ssl连接并且传输数据(证书不受信)

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

curl -sSL https://get.daocloud.io/docker | sh

wget -qO- https://get.docker.com/ | bash

bash -c "$(curl -fsSL https://raw.githubusercontent.com/kenzok8/Trojan/master/trojan-go_install.sh)"

用date打日志的方法

1
2
3
4
5
6
7
8
9
date "+【%Y-%m-%d %H:%M:%S】 The configuration file already exists!" 2>&1 | tee -a $logPath

同时会显示日制,并且把日志追加到文件中.
参考:https://raw.githubusercontent.com/vsyour/onekey/main/run.sh


#将获取当前时间(恢复出厂设置)和包括换行符的文字內容輸出到文档
echo -e `date '+%Y-%m-%d %H:%M:%S %A'` "\nHello World !" >> test.txt

shell if判断写成一行

1
2
3
4
[[ $? -eq 0 ]] && echo "backup $i success" || exit
#判断上一个命令是否执行正确,退出状态吗如果为0,则执行echo 。否则会认为[[ $? -eq 0 ]] && echo "backup $i success" 这一段执行错误,就会退出

参考:https://www.cnblogs.com/shiyiwen/p/8509417.html

获取24小时前的日期存入变量

1
resultsName=$(date -d @$((`date +%s`-3600*24)) '+%Y%m%d')

shell中各种括号的作用

1
2
3
4
5
6
shell中各种括号的作用()、(())、[]、[[]]、{}

参考: https://www.runoob.com/w3cnote/linux-shell-brackets-features.html
参考: https://blog.csdn.net/taiyang1987912/article/details/39551385
参考: https://blog.csdn.net/tg5156/article/details/19406275
重点参考: https://blog.csdn.net/x1269778817/article/details/46535729

这里常用:= 仔细读上表收获非常大。

shell 判断是否已安装了某个软件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 判断是否安装了node
if ! type node >/dev/null 2>&1; then
echo 'node 未安装';
else
echo 'node 已安装';
fi


# 判断是否安装了npm
if ! type npm >/dev/null 2>&1; then
Echo_Red 'npm 未安装';
exit 1;
fi


# 在shell中判断某个可执行程序是否存在
# 参考:https://segmentfault.com/q/1010000000156870
$ command -v foo >/dev/null 2>&1 || { echo >&2 "I require foo but it's not installed. Aborting."; exit 1; }

$ type foo >/dev/null 2>&1 || { echo >&2 "I require foo but it's not installed. Aborting."; exit 1; }

$ hash foo 2>/dev/null || { echo >&2 "I require foo but it's not installed. Aborting."; exit 1; }

if which brew 2>/dev/null; then
echo "brew exists!"
else
echo "nope, no brew installed."
fi

shell脚本添加crontab

使用shell脚本或命令行 添加crontab 定时任务

crontab 是运维过程中常用的定时任务执行工具

​ 一般情况下在有新的定时任务要执行时,使用crontab -e ,将打开一个vi编辑界面,配置好后保存退出,但是在自动化运维的过程中往往需要使用shell脚本或命令自动添加定时任务。

接下来结束三种(Centos)自动添加的crontab 任务的方法:

使用 crontab - 命令加载管道输出

1
2
3
4
5
6
7
8
9
10
11
12
# crontab_job="* * * * * echo world"

#添加cron_job定时任务
# ( crontab -l | grep -v "$cron_job"; echo "$cron_job" ) | crontab -

# 删除cron_job定时任务
# ( crontab -l | grep -v"$cron_job" ) | crontab -


另一例子:
CRONTAB_CMD="*/1 * * * * sh $PROGRAM once > /dev/null 2>&1 &"
(crontab -l 2>/dev/null | grep -Fv $PROGRAM; echo "$CRONTAB_CMD") | crontab -

其中,crontab - 可以读取管道传输过来的crontab配置。

将需要添加的定时任务echo到crontab -l的结果后面,再通过管道传输给crontab - 进行加载,便完成了添加;

通过grep -v去除crontab -l 中想要删除的定时任务,再传给crontab -加载配置完成删除。

一条命令就完成了crontab任务的添加和删除,非常方便。

其他更多方法

方法一:

编辑 /var/spool/cron/用户名 文件,如:

1
echo "* * * * * hostname >> /tmp/tmp.txt" >> /var/spool/cron/root

优点:简单

缺点:需要root权限

方法二:

编辑 /etc/crontab 文件,

1
echo "* * * * * root hostname >> /tmp/tmp.txt" >> /etc/crontab

需要注意的是:

与常用的crontab 有点不同,/etc/crontab 需指定用名。

而且该文件定义为系统级定时任务 不建议添加非系统类定时任务,编辑该文件也需要root权限

方法三:

利用crontab -l 加 crontab file 两个命令实现自动添加

1
crontab -l > conf && echo "* * * * * hostname >> /tmp/tmp.txt" >> conf && crontab conf && rm -f conf

由于crontab file会覆盖原有定时任务,所以使用 crontab -l 先导出原有任务到临时文件 “conf” 再追加新定时任务

优点:不限用户,任何有crontab权限的用户都能执行

缺点:稍微复杂

shell 字符串操作(长度,查找,替换)

在做shell批处理程序时候,经常会涉及到字符串相关操作。

有很多命令语句,如:awk,sed都可以做字符串各种操作。

其实shell内置一系列操作符号,可以达到类似效果,大家知道,

使用内部操作符会省略启动外部程序等时间,因此速度会非常的快。

1
原文参考:https://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html

一、判断读取字符串值

表达式 含义
${var} 变量var的值, 与$var相同
${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
${var:+OTHER} 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG *
${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG *
${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量
${!varprefix@} 匹配之前所有以varprefix开头进行声明的变量

加入了“*” 不是意思是: 当然, 如果变量var已经被设置的话, 那么其值就是$var.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[chengmo@localhost ~]$ echo ${abc-'ok'}
ok
[chengmo@localhost ~]$ echo $abc

[chengmo@localhost ~]$ echo ${abc='ok'}
ok
[chengmo@localhost ~]$ echo $abc
ok



如果abc 没有声明“=" 还会给abc赋值。

[chengmo@localhost ~]$ var1=11;var2=12;var3=
[chengmo@localhost ~]$ echo ${!v@}
var1 var2 var3
[chengmo@localhost ~]$ echo ${!v*}
var1 var2 var3



${!varprefix*}${!varprefix@}相似,可以通过变量名前缀字符,搜索已经定义的变量,无论是否为空值。

二、字符串操作(长度,读取,替换)

表达式 含义
```$

欢迎关注我的其它发布渠道