美文网首页
Shell编程

Shell编程

作者: 攻城老狮 | 来源:发表于2021-04-08 21:31 被阅读0次

一 基本语法

1 变量

变量分为环境变量本地变量

  • 定义变量
VAR=hello # 等号两侧没有空格
echo $VAR # 获取变量值
  • 声明为环境变量
export VAR # 将本地变量声明为环境变量
env | grep $VAR # 从 env 中获取 VAR 变量
  • 删除变量
unset VAR

2 命令代换

# 输出date命令
DATE=`date` # or  DATE=$(date)
echo $DATE

3 算数代换

echo $[10+20] # 30
echo $[2#10+11] # 13 二进制的10 和 十进制的11 相加

VAR=45
echo $[$VAR+10] # 55 or echo $[VAR+10]  or echo $((VAR+10)) or echo $(($VAR+10))

4 转义字符

touch \$\ \$file

touch -- -abc
rm -- -abc

touch ./--abc
rm ./--abc

5 单双引号

VAR=`date` 
echo "$VAR" # 2021年 04月 07日 星期三 22:54:48 CST
echo '$VAR' # $VAR

二 Shell 脚本语法

1 条件测试

注:判断变量时候最好带上双引号

# 整数或者取值为整数的变量:-eq(等于) -ne(不等于) -lt(小于) -le(小于等于) -gt(大于) -ge(大于等于)
VAR=50
test $VAR -eq 50
echo $? # 0
test $VAR -ne 50
echo $? # 1
test $VAR -gt 30
echo $? # 0
[ $VAR -lt 10 ] # 等价于 test $VAR -lt 10
echo $? # 1

# 目录,文件-d(目录) -f(普通文件) 
[ -d testdir ]
echo $? # 0
[ -f testfile ]
echo $? # 0

# 字符串或者取值为字符串的变量 -z(字符串长度为零) -n(字符串长度非零) =(相等) !=(不相等)
VAR=hello
[ -z $VAR ]
echo $? # 1
[ -n $VAR ]
echo $? # 0

VAR= # 空值
[ -n $VAR ]
echo $? # 0
[ -n "$VAR" ] # 判断变量时候最好带上双引号,防止出错
echo $? # 1

VAR1=hello
VAR2=hello
[ $VAR1 = $VAR2 ] # 判断变量时候最好带上双引号,防止出错
echo $? # 0
[ $VAR1 != $VAR2 ]
echo $? # 1

# 与或非 -a(与) -o(或) !(非)
VAR=hello
[ -d testdir -a "$VAR" = "hello" ]
echo $? # 0

2 分支

  • if 语句(模糊匹配)
#! /bin/bash
# 判断传入的是文件还是目录
echo "please enter the test content: "
read content # 读取输入
if [ -d "$content" ]; then
    echo "it is dir"
elif [ -f "$content" ]; then
    echo "it is file"
else
    echo "unkown"
fi
  • case 语句(精准匹配)
#! /bin/bash
# 判断传入的是yes或no
echo "please enter your choice(yes/no): "
read BUF
case "$BUF" in
    yes|y|Y|Yes)
        echo "yes!"
        ;;
    [nN]?)
        echo "no!"
        ;;
    *)
        echo "unkonwn"
        ;;
esac

3 循环

  • for循环
#! /bin/bash
# 判断ls列举的内容是目录还是文件类型
for MYFILE in `ls`; do
    
    if [ -d "$MYFILE" ]; then
        echo "$MYFILE is a dir"
    elif [ -f ""$MYFILE ]; then
        echo "$MYFILE is a file"
    else
        echo "$MYFILE is others"
    fi  

done
  • while 循环
#! /bin/bash
# 判断输入的密码是否正确,并且有尝试的次数限制
COUNT=2
echo "enter your password: "
read PWD
while [ "$PWD" != "yorick" -a $COUNT -gt 0 ]; do
    echo "you have only $COUNT times,try again: "
    read PWD
    COUNT=$[COUNT-1]
done

if [ $COUNT -eq 0 ]; then
    echo "fault"
    exit 1
fi

echo "success"

4 位置参数和特殊变量

#! /bin/bash
echo $0 # argv[0]
echo $1 # argv[1]
echo $2 # argv[2]
echo $3 # argv[3]

shift # 参数左移
shift
echo $0
echo $1
echo $2
echo $3

echo $@ # 显示参数列表 argv[1] argv[2] ...
echo $# # 参数个数 argc-1
echo $$ # 当前进程号
# 测试
./t5.sh aa bb cc dd ee ff
# result
./t5.sh
aa
bb
cc
./t5.sh
cc
dd
ee
cc dd ee ff
4
56334

5 输入输出

  • echo
-e 解析转义字符
-n 不回车换行,默认情况echo回显的内容后面跟一个回车换行
  • tee
# 把结果输出到标准输出的同时,另一个副本输出到相应文件
ls -l | tee out # 即输出到屏幕,又复制到out文件
  • 文件重定向
cmd > file # 标准输出重定向到file
cmd >> file # 追加file
cmd > file 2>&1 # 标准出错也重定向到file
cmd >> file 2>&1 
cmd < file1 > file2 # 把file1输入到标准输出,再重定向到file2

6 函数

#! /bin/bash
# 判断目录是否存在,不存在则创建
is_dir()
{
    DIR_NAME=$1
    if [ ! -d "$DIR_NAME" ]; then
        return 1
    else
        return 0
    fi
}

for DIR in "$@";do
    if is_dir "$DIR";then
        :
    else
        echo "$DIR doesn't exist,creating it now..."
        mkdir $DIR > /dev/null 2>&1
        if [ $? -ne 0 ]; then
            echo "cannot create directory $DIR"
            exit 1
        fi
    fi
done

7 调试

#! /bin/bash -x 
# 调试
is_dir()
{
    DIR_NAME=$1
    if [ ! -d "$DIR_NAME" ]; then
        return 1
    else
        return 0
    fi
}

for DIR in "$@";do
    set -x # 调试
    if is_dir "$DIR";then
        :
    else
        echo "$DIR doesn't exist,creating it now..."
        mkdir $DIR > /dev/null 2>&1
        if [ $? -ne 0 ]; then
            echo "cannot create directory $DIR"
            exit 1
        fi
    fi
    set +x # 调试
done

三 正则表达式

1 字符类

image-20210408160140494.png

2 数量限定符

image-20210408161058778.png

3 位置限定符

image-20210408161130066.png

4 其他特殊字符

image-20210408162036080.png
# egrep "正则" 文件
# or grep -E "正则" 文件
egrep "^([0-9]{1,3}\.){3}[0-9]{1,3}$" regexDemo 

相关文章

  • shell 案例

    Shell编程一 Shell防范ARP攻击 Shell编程二 Shell防范DDos攻击 Shell编程三 ...

  • shell 第一天

    shell编程初识 1.1 shell编程初识 shell的定义 Shell 是命令解释器 Shell 也是...

  • 78.shell编程

    shell编程 Shell脚本,是一种为shell编写的脚本程序。 Shell编程跟JavaScript、Pyth...

  • 2019-01-25

    Linux系统Shell编程指南 前言 适合人群:有类似C编程基础的人 一、Shell编程介绍 Shell解释型语...

  • day 28

    shell编程基础 shell编程一小时光速入门web集群架构会用到shell编程基础 1、为什么要学shell编...

  • Shell 编程的 Hello World

    什么是 Shell?简单来说,Shell 编程是对 Linux 命令的逻辑化处理。 来看看 Shell 编程是如何...

  • Shell 编程的 Hello World

    什么是 Shell?简单来说,Shell 编程是对 Linux 命令的逻辑化处理。 来看看 Shell 编程是如何...

  • 后端运维人员必备shell编程入门

    本文转载自 公众号 Snailclimb Shell 编程入门 走进 Shell 编程的大门 为什么要学Shell...

  • shell编程

    Shell脚本,是一种为shell编写的脚本程序。 Shell编程跟JavaScript、Python编程一样,只...

  • day28-2019年4月9日

    shell编程基础 1、为什么要学shell编程? linux系统中会大量得使用shell,工作中也需要...

网友评论

      本文标题:Shell编程

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