SHELL编程基础

SHELL

  • Shell 编程语法总结
    • Shell 编程基础语法
      • 一、变量
        • 1.1 Shell 变量名
        • 1.2 使用 Shell 变量
        • 1.3 只读变量
        • 1.4 删除变量
      • 二、字符串
        • 2.1 定义字符串
        • 2.2 获取字符串长度
        • 2.3 提取子字符串
        • 2.4 查找子字符串
      • 三、运算符
        • 3.1 算术运算符
        • 3.2 关系运算符
          • 3.2.1 数字关系
          • 3.2.2 文件权限
      • 四、流程控制
        • 4.1 if 判定
        • 4.2 case 语句
        • 4.3 for 循环
        • 4.4 while 循环
      • 五、函数
        • 5.1 函数基础
        • 5.2 自动化监视脚本
        • 5.3 服务器初始化
    • 第二章 基本语法
      • 一、带参数的 Shell 函数
        • 1.1 打印出传递的参数
        • 1.2 判断成绩是否合格
        • 1.3 等级赋分
      • 二、无参数的 Shell 函数
        • 2.1 遍历输出 1-5
        • 2.2 遍历输出 1-100
        • 2.3 遍历输出 1-100 的所有奇数
        • 2.4 遍历根目录下所有内容
        • 2.5 计算 1-100 的累加和
        • 2.6 无限循环打印特定值
        • 2.7 选择 1-4 中的某一个值确认
        • 2.8 每过一百秒打印当前日期
        • 2.9 打印 1-30 的数,跳过 3 的倍数

Shell 编程语法总结

Shell 编程的语法主要分为以下五个环节:变量、字符串、运算符、流程控制和函数五大部分。

Shell 编程基础语法

一、变量

1.1 Shell 变量名
  1. 变量名中不能用 $(在 Shell 中表示引用)。

  2. 变量名和等号之间不能有空格。

    username="张三"
    
  3. 可以使用字母、数字和下划线,但首字母不能是数字。

  4. 不能使用 Bash 的关键字。

  5. 不能使用标点符号,变量名中间不能有空格。

1.2 使用 Shell 变量

使用已定义的 Shell 变量时,在变量名前加 $

yourname=zhangsan
myname=lisi
echo $yourname
echo ${yourname}  # 加花括号可以识别变量边界
1.3 只读变量

定义后不可修改或删除。

readonly yourname
1.4 删除变量

普通变量可以使用 unset 删除,只读变量不能删除。

unset myname

二、字符串

2.1 定义字符串
  • 单引号:无法解析变量或转义字符,内容按原样输出。

    skill='java'
    str='I am good at $skill'
    echo $str  # 输出:I am good at $skill
    
  • 双引号:可以包含变量和转义字符。

    skill='java'
    str="I am good at $skill"
    echo $str  # 输出:I am good at java
    
2.2 获取字符串长度
skill='java'
echo ${#skill}  # 输出:4
2.3 提取子字符串
skill='I like Java'
echo ${skill:2}     # 从第 2 个字符开始截取
# 输出:like Java
echo ${skill:2:2}  # 从第 2 个字符开始,截取 2 个字符
# 输出:li
2.4 查找子字符串

查找 like 字符串中 i 的位置。

skill='like'
echo `expr index "$skill" i`  # 输出:2

三、运算符

3.1 算术运算符

使用 expr 执行加减乘除运算,注意:

  • 表达式和运算符之间需有空格。
  • 表达式需用反引号包裹。
#!/bin/bash
a=8
b=9
# 加法
echo `expr $a + $b`  # 输出:17
# 乘法(需转义 `*`)
echo `expr $a \* $b`  # 输出:72
# 取余
echo `expr $b % $a`  # 输出:1
3.2 关系运算符
3.2.1 数字关系
运算符 含义
-eq 等于
-ne 不等于
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
3.2.2 文件权限

Linux 使用 3 组二进制数表示文件权限:

  • 000:无权限。
  • 777:全部权限。

四、流程控制

4.1 if 判定
#!/bin/bash
if [ "$1"x = "gu"x ]
then
    echo "welcome, gu"
fi

if [ $2 -lt 18 ]
then
    echo "未成年人"
elif [ $2 -lt 35 ]
then
    echo "青年人"
elif [ $2 -lt 60 ]
then
    echo "中年人"
else
    echo "老年人"
fi
4.2 case 语句
#!/bin/bash
case $1 in
1)
    echo "one"
    ;;
2)
    echo "two"
    ;;
3)
    echo "three"
    ;;
*)
    echo "number else"
    ;;
esac
4.3 for 循环
#!/bin/bash
for IP in `cat /root/for/ip.txt`
do
  ping -c 3 -i 0.2 -w 3 $IP &>/dev/null
  if [ $? -eq 0 ]; then
      echo "host $IP is up"
  else
      echo "host $IP is down"
  fi
done
4.4 while 循环
#!/bin/sh
counter=5
factorial=1
while [ $counter -gt 0 ]
do 
  factorial=$(( $factorial * $counter ))
  ((counter--))
done 
echo $factorial

五、函数

5.1 函数基础
#!/bin/bash
fun1 (){
   echo "这是一个函数"
}
fun1
5.2 自动化监视脚本
#!/bin/bash
NIC=$1
echo -e " In ------ Out"
while true; do
    OLD_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
    OLD_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
    sleep 1
    NEW_IN=$(awk  '$0~"'$NIC'"{print $2}' /proc/net/dev)
    NEW_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
    IN=$(printf "%.1f%s" "$((($NEW_IN-$OLD_IN)/1024))" "KB/s")
    OUT=$(printf "%.1f%s" "$((($NEW_OUT-$OLD_OUT)/1024))" "KB/s")
    echo "$IN $OUT"
    sleep 1
done
5.3 服务器初始化
#/bin/bash
# 设置时区并同步时间
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
if ! crontab -l |grep ntpdate &>/dev/null ; then
    (echo "* 1 * * * ntpdate time.windows.com >/dev/null 2>&1";crontab -l) |crontab
fi
 
# 禁用selinux
sed -i '/SELINUX/{s/permissive/disabled/}' /etc/selinux/config
 
# 关闭防火墙
if egrep "7.[0-9]" /etc/redhat-release &>/dev/null; then
    systemctl stop firewalld
    systemctl disable firewalld
elif egrep "6.[0-9]" /etc/redhat-release &>/dev/null; then
    service iptables stop
    chkconfig iptables off
fi
 
# 历史命令显示操作时间
if ! grep HISTTIMEFORMAT /etc/bashrc; then
    echo 'export HISTTIMEFORMAT="%F %T `whoami` "' >> /etc/bashrc
fi
 
# SSH超时时间
if ! grep "TMOUT=600" /etc/profile &>/dev/null; then
    echo "export TMOUT=600" >> /etc/profile
fi
 
# 禁止root远程登录
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
 
# 禁止定时任务向发送邮件
sed -i 's/^MAILTO=root/MAILTO=""/' /etc/crontab
 
# 设置最大打开文件数
if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; then
    cat >> /etc/security/limits.conf << EOF
    * soft nofile 65535
    * hard nofile 65535
EOF
fi
 
# 系统内核优化
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 20480
net.ipv4.tcp_max_syn_backlog = 20480
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 20
EOF
 
# 减少SWAP使用
echo "0" > /proc/sys/vm/swappiness
 
# 安装系统性能分析工具及其他
yum install gcc make autoconf vim sysstat net-tools iostat if

第二章 基本语法

  1. 带参数的 Shell 函数
    • 打印出传递的参数
    • 判断成绩是否合格
    • 等级赋分
  2. 无参数的 Shell 函数
    • 遍历输出 1-5
    • 遍历输出 1-100
    • 遍历输出 1-100 的所有奇数
    • 遍历根目录下所有内容
    • 计算 1-100 的累加和
    • 无限循环打印特定值
    • 选择 1-4 中的某一个值确认
    • 每过一百秒打印当前日期

一、带参数的 Shell 函数

1.1 打印出传递的参数
#!/bin/bash
fun1(){
    echo "我的第一个函数"
    echo "参数1:$1"
    echo "参数2:$2"
    echo "参数3:$3"
    echo "获取所有参数"
    echo "$*"
    echo "$@"
}
fun1 aa bb cc
1.2 判断成绩是否合格
#!/bin/bash
score=40
fun1(){
    echo "成绩判断函数"
    if [ $score -gt 60 ] ; then
        echo "及格"
    else
        echo "不及格"
    fi
}
fun1 score
1.3 等级赋分
#!/bin/bash
score=40
fun1(){
    echo "成绩判断函数"
    if [ $score -ge 90 ] ; then
        echo "A"
    elif [ $score -ge 80 ] ; then
        echo "B"
    elif [ $score -ge 70 ] ; then
        echo "C"
    elif [ $score -ge 60 ] ; then
        echo "D"
    else
        echo "E"
    fi
}
fun1 score

二、无参数的 Shell 函数

2.1 遍历输出 1-5
#!/bin/bash
fun1(){
    echo "遍历函数"
    for i in 1 2 3 4 5; do
        echo $i
    done
}
fun1
2.2 遍历输出 1-100
#!/bin/bash
fun1(){
    echo "遍历函数"
    for i in {1..100}; do
        echo $i
    done
}
fun1
2.3 遍历输出 1-100 的所有奇数
#!/bin/bash
fun1(){
    echo "遍历函数"
    for i in {1..100..2}; do
        echo $i
    done
}
fun1
2.4 遍历根目录下所有内容
#!/bin/bash
fun1(){
    echo "遍历函数"
    for f in `ls /`; do
        echo $f
    done
}
fun1
2.5 计算 1-100 的累加和
#!/bin/bash
fun1(){
    echo "计算 1-100 的累加和"
    sum=0
    i=1
    while [ $i -le 100 ]; do
        sum=$(( sum + i ))
        i=$(( i + 1 ))
    done
    echo $sum
}
fun1
2.6 无限循环打印特定值
#!/bin/bash
fun1(){
    echo "无限循环打印 hello"
    for((;;))
    do
        echo "hello"
        sleep 1
    done
}
fun1
2.7 选择 1-4 中的某一个值确认
#!/bin/bash
fun1(){
    echo "请输入 1-4 的关键字"
    read anum
    case $anum in
        1) echo "你选择了 1" ;;
        2) echo "你选择了 2" ;;
        3) echo "你选择了 3" ;;
        4) echo "你选择了 4" ;;
        *) echo "无效选择" ;;
    esac
}
fun1
2.8 每过一百秒打印当前日期
#!/bin/bash
fun1(){
    echo "每过一秒打印当前日期,执行十次停止"
    i=0
    while true;
    do
        sleep 1
        echo $i $(date +"%Y-%m-%d %H:%M:%S")
        i=$(( i + 1 ))
        if [ $i -eq 10 ]; then
            break
        fi
    done
}
fun1
2.9 打印 1-30 的数,跳过 3 的倍数
#!/bin/bash
fun1(){
    echo "打印 1-30,跳过 3 的倍数"
    for i in {1..30}; do
        if [ $(( i % 3 )) -eq 0 ]; then
            continue
        fi
        echo $i
    done
}
fun1

你可能感兴趣的:(#,四,SHELL,python,chrome,开发语言)