- 获取执行文件的绝对路径
workdir = $(cd $(dirname $0);pwd)
- set -e -o pipefail errexit(同-e) 脚本出错即停
set -x 会在执行每一行 shell 脚本时,把执行的内容输出来。它可以让你看到当前执行的情况,里面涉及的变量也会被替换成实际的值。 - 特殊变量
$!(shell最后运行的后台进程的PID)
$$(shell本身pid)
$?(获取前一个命令执行状态)
$*(获取参数列表,返回("$1 $2 $3"))
$@(获取参数列表,返回("$1" “$2” “$3”))
$#(获取传参的个数) - 换着花样玩儿变量
例:path=/a/b/c/d/a/c/b
(1)echo ${path#/*c}
匹配$path 以第一个c为分割符的右边 >>/d/a/c/b
(2)echo ${path##*c}
匹配$path 以最后一个c为分割符的右边 >>/b
(3)echo ${path%c*}
匹配$path 以最后一个c为分隔符的左边部分 >>/a/b/c/d/a/
(4)echo ${path%%c*}
匹配$path 以第一个c为分隔符的左边部分 >>/a/b/
(5)echo ${path/c/w}
将匹配到的第一个字符’c’替换成’w’
(6)echo ${path//c/w}
将匹配到的所有字符’c’替换成’w’
(1)${value:-word}
若变量value未定义或为空,则用word替换; world一般为常用、默认参数 常用判断传入参数是否为空、rm -rf /${path}
等时候
(2)${value:=word}
若变量value未定义或为空,则返回word 且将word赋值给value word一般为常用值
(3)${value:?word}
例echo ${c:?变量未定义或者未赋值} c为空或未赋值,输出提示语,并终止程序 常用
(4)${value:+word}
若value已赋值,则value=word
(5)${#value}
统计value中字符的个数 常用 - 插入多行到文本末尾,若是替换则将cat>>test.sh改为cat>test.sh
cat>>test.sh<< EOF
+--------------------------------------------------------------+
| === Welcome to Tunoff services === |
+--------------------------------------------------------------+
EOF
- 多姿多彩的文字
echo -e "\033[5;41;37m hello \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[34m 黄色字 \033[0m"
echo -e "\033[41;33m 红底黄字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
字颜色:30—–37
echo -e “\033[30m 黑色字 \033[0m”
echo -e “\033[31m 红色字 \033[0m”
echo -e “\033[32m 绿色字 \033[0m”
echo -e “\033[33m 黄色字 \033[0m”
echo -e “\033[34m 蓝色字 \033[0m”
echo -e “\033[35m 紫色字 \033[0m”
echo -e “\033[36m 天蓝字 \033[0m”
echo -e “\033[37m 白色字 \033[0m”
字背景颜色范围:40—–47
echo -e “\033[40;37m 黑底白字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
echo -e “\033[42;37m 绿底白字 \033[0m”
echo -e “\033[43;37m 黄底白字 \033[0m”
echo -e “\033[44;37m 蓝底白字 \033[0m”
echo -e “\033[45;37m 紫底白字 \033[0m”
echo -e “\033[46;37m 天蓝底白字 \033[0m”
echo -e “\033[47;30m 白底黑字 \033[0m”
\33[0m 关闭所有属性
\33[1m 设置高亮度
\33[4m 下划线
\33[5m 闪烁
\33[7m 反显
\33[8m 消隐
\33[30m — \33[37m 设置前景色
\33[40m — \33[47m 设置背景色
\33[nA 光标上移n行
\33[nB 光标下移n行
\33[nC 光标右移n行
\33[nD 光标左移n行
\33[y;xH设置光标位置
\33[2J 清屏
\33[K 清除从光标到行尾的内容
\33[s 保存光标位置
\33[u 恢复光标位置
\33[?25l 隐藏光标
\33[?25h 显示光标
-
文件判断
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真 -
连接数据库
sql_command="create database IF NOT EXISTS ${DBNAME}"
mysql -h${host_name} -P${port} -u${user_name} -p${paaswd} -e "${sql_commands}"
- 循环获取连续数字
(1) for i in {1…10}
(2) for i in `seq 1 10` - 多线程,parallel命令
&:后台运行
wait:等子线程结束之后进行下面的命令
for num in `seq 1 ${all_num}`
do
{
sleep 1
echo ${num}
} &
done
wait
parallel命令是非常强大的并行计算命令,使用-j参数控制其并发数量,推荐
parallel -j 5 “sleep 1;echo {}” ::: `seq 1 10`
cat bigfile.txt | parallel --pipe grep ‘pattern’ 当需要操作一个特别大的文档时
cat bigfile.txt | parallel --pipe sed s/old/new/g
-
定时任务
方法一:1. 键入 crontab -e 编辑crontab服务文件;2. 用 crontab -l 命令查看是否成功 3. /sbin/service crond start 4. ps -ax | grep cron
方法二:1. 创建xx.crontab文件;2.进入xx文件编辑定时任务(有多个定时任务时);3.crontab xx.crontab。4. 删除crontab -r xx.crontab
crontab -l > conf && echo “crontab_command” >> conf && crontab conf
方法三:死循环+sleep;for ((;;))
,while:
orwhile true:
等
| */2 * 1-15 1,5,9 0 /bin/sh /home/test.sh |
| 分 小时 日 月 星期 命令 |0-59 0-23 1-31 1-12 0-6 command (取值范围,0表示周日一般一行对应一个任务)
记住几个特殊符号的含义:
“*”代表取值范围内的数字,
“/”代表”每”
“-”代表从某个数字到某个数字,
“,”分开几个离散的数字
crontab命令
cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除没个用户的cron服务
crontab -e //编辑某个用户的cron服务 -
bash中多用[[ ]]代替[],test等,更加通用
字符表达式的比较使用 [[ ]] ,其运算符 =、!=、-n、-z
文件表达式的测试使用 [[ ]] ,其运算符 -r、-l、-w、-x、-f、-d、-s、-nt、-ot
逻辑表达式的测试使用 [[ ]] ,其运算符 !、&&、||
数字比较、字符比较、逻辑测试可以组合,如$ [[ “a” != “b” && 4 -gt 3 ]]
支持bash中的通配符扩展,如:[[ hest = h??t ]] 、[ hest = h*t ]] -
echo命令
echo -n “hello world” 输出不换行
echo -e “\033[30m 黑色字 \033[0m” 输出转义字符 -
文件压缩、解压命令
.tar 解压 tar xzvf filename.tar -C dirname
压缩 tar czvf filename.tar dirname
.zip 解压 unzip filename.zip -d dirname
压缩 zip filename.zip dirname
.gz 解压1 gunzip filename.gz
解压2 gzip -d filename.gz
压缩 gzip filename
.tar.gz 和 .tgz 解压 tar zxvf filename.tar.gz
压缩 tar zcvf filename.tar.gz dirname
.bz2 解压1 bzip2 -d filename.bz2
解压2 bunzip2 filename.bz2
.bz2 压缩 bzip2 -z filename
.tar.bz2 解压 tar jxvf filename.tar.bz2
压缩 tar jcvf filename.tar.bz2 dirname
.bz 解压1 bzip2 -d filename.bz
解压2 bunzip2 filename.bz
.tar.bz 解压 tar jxvf filename.tar.bz
.z 解压 uncompress filename.z
压缩 compress filename
.tar.z 解压 tar zxvf filename.tar.z
压缩 tar zcvf filename.tar.z dirname
.rar 解压 unrar e filename.rar
压缩 rar a filename.rar dirname -
expect命令
场景一:
#!/bin/expect
spawn su root
expect "password: "
send "123456\r"
expect eof
exit
场景二:用于bash中简单的交互
expect "*password*" {send "$password\r"}
场景三:嵌入bash中的多个expect交互
while :
do
/usr/bin/expect << EOF
set timeout 30 # 超时参数,默认单位为秒;超过30s则跳过expect;timeout -1 永不超时
spawn ssh root@192.168.2.195
expect { # 一个命令需要进行多次交互
"(yes/no)?" { send "yes\r"; exp_continue } # exp_continue:附加在expect语句后,同个expect语句中已匹配一项后,可以继续匹配其他项,例:"password:"
"password:" { send "123456\r" } # '\r'一定要带
}
expect "*#" # 登录节点后的在命令行上交互
send "touch test.sh\r"
expect "*#"
send "exit\r"
interact # 执行完成后保持交互状态,可以手工操作。如果没有该命令,命令完成后即退出。
EOF
sleep 5m
done