shell基础知识

本文深入探讨Shell脚本的高级应用,包括复杂变量操作、文本美化、文件与进程管理、数据库交互、定时任务配置及常见压缩命令。通过实战案例,如expect自动化SSH登录和crontab定时任务设置,提升脚本编写效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 获取执行文件的绝对路径
workdir = $(cd $(dirname $0);pwd)
  1. set -e -o pipefail errexit(同-e) 脚本出错即停
    set -x 会在执行每一行 shell 脚本时,把执行的内容输出来。它可以让你看到当前执行的情况,里面涉及的变量也会被替换成实际的值。
  2. 特殊变量
    $!(shell最后运行的后台进程的PID)
    $$(shell本身pid)
    $?(获取前一个命令执行状态)
    $*(获取参数列表,返回("$1 $2 $3"))
    $@(获取参数列表,返回("$1" “$2” “$3”))
    $#(获取传参的个数)
  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中字符的个数 常用
  4. 插入多行到文本末尾,若是替换则将cat>>test.sh改为cat>test.sh
cat>>test.sh<< EOF
+--------------------------------------------------------------+
| === Welcome to Tunoff services === |
+--------------------------------------------------------------+
EOF
  1. 多姿多彩的文字
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 显示光标

  1. 文件判断
    -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 如果文件是软链接,则为真

  2. 连接数据库

sql_command="create database IF NOT EXISTS ${DBNAME}"
mysql -h${host_name}  -P${port}  -u${user_name} -p${paaswd} -e "${sql_commands}"
  1. 循环获取连续数字
    (1) for i in {1…10}
    (2) for i in `seq 1 10`
  2. 多线程,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. 定时任务
    方法一: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: or while 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服务

  2. 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 ]]

  3. echo命令
    echo -n “hello world” 输出不换行
    echo -e “\033[30m 黑色字 \033[0m” 输出转义字符

  4. 文件压缩、解压命令
    .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

  5. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值