shell脚本基础

本文详细介绍了Shell脚本的基础知识,包括变量的概念、类型(普通变量、局部变量和只读变量)、数组的定义与操作、控制语句(如if、for、while、case)、函数的使用以及如何处理输出和输入。还讨论了Shell中的运算符和特殊文件/dev/null的应用。
摘要由CSDN通过智能技术生成
  • 什么是shell脚本

    • shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器 解释运行,所以速度相对来说比较慢。

  • 编写shell脚本及执行

    • #!/bin/bash echo “hello world ”

    • chmod +x ./test.sh.#使脚本具有执行权限 ./test.sh #执行脚本

  • 基本语法

    • 变量

      • 概念

        • 变量名其实就是一片内存区域的地址或者可以说是寻址符号,有了变量我们就可以使用一串固定的字符来表示不固定的目标.

      • 类型

        • 普通变量

          • A=123引用变量: $ 变量名 或者 ${ 变量名 } dir=`pwd`

          • 定义变量: 变量名=变量值 变量名必须以字母或下划线开头, 引用变量变量名或{变量名} 查看变量: echo $变量名 set(所有变量: 包括自定义变量和环境变量) 取消变量: unset 变量名 作用范围: 仅在当前Shell中有效,打开其他shell获取

        • 环境变量

          • 系统预定义的参数 临时:export(切换shell的时候临时变量就会消失) 永久:/etc/bashrc 和/etc/profile

          • 1.方法一export_back_dir2=/home/backup 2.方法二export_back_dir1 将自定义变量转换成环境变量 引用环境变量: 变量名 或(变量名) 查看环境变量: echo $变量名 env 例如 env|grep back_dir2 取环境变量: unset 变量名 变量作用范围: 在当前Shell和子Shell有效

        • 位置变量

          • $0:表示脚本名称 $1:表示脚本第一个参数 $2:表示脚本第二个参数 以此类推...... $?:返回值(上一个函数的执行结果,保存值)显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 $$:代表进程的ID号 $#:代表当前shell的参数个数 $@:代表所有参数(逐个读取) 当你输出第 10 个参数的时候,$10,错误,从 10 往后需要大家注意,需要添加${10}

      • 变量操作

        • 1.创建普通变量:组要注意的是等号两边不能有空格name=*test”

        • 2.创建局部变量:local name="test”,使用local修饰的变量在函数体外无法访问,只能在函数体中使用

        • 3.创建只读变量:name=“only_read”-> readonly name ,这种变量不可以被修改

        • 4.使用变量: echo $name 或者 echo ${name}

        • 5.删除变量: unset name ,删除之后的变量无法被访问,需要注意无法删除只读变量

      • 字符串变量

        • 1.使用单引号创建: var='test' 这种方式创建的变量只能原样输出,变量无效,我们可以借用C中的“字符串常量"的定义理解这种特性。除此以外,单引号中不能出现单独的单引号,转义也是不可以的。

        • 2.使用双引号创建: var="my name is ${name}”,这种方式创建的字符串变量有效,也可以出现转义符

      • 数组

        • 定义

          • 数组:array 下标index 从0开始

        • 分类

          • 索引数组(下标从0开始的)

            • array_name=(1 2 3 4) echo "${array_name[0]}"

            • 指定数组小标进行赋值 a_name[0]=1 a_name[1]=2 a_name[2]=3 echo "${a_name[2]}"

            • 子主题 3

          • 关联数组 -A选项就是声明一个关联数组 等号左边的叫键 右边的叫值

            • declare -A xinxin=(["name"]="ck" ["age"]="18") echo "${xinxin["name"]}" echo ""

            • declare -A xin xin["name"]="ck" xin["age"]="18" echo "${xin["name"]}"

        • 数组操作

          • @和*获取所有元素

            • array_name=(1 2 3 4) echo "${array_name[@]}" echo "" declare -A xinxin=(["name"]="ck" ["age"]="18") echo "${xinxin[*]}" echo ""

          • !获取数组所有的键,需要在数组前添加

            • #/bin/bash declare -A xinxin =(["name"]="whoaliang" ["age"]="18" ["tel"]="110") ehco "${!xinxin[@]}" echo ""

          • #:获取数组长度 需要在数组名称前添加

            • #/bin/bash array_name=( i am westos teacher welcome to westos training class) for ((i=0,I<${#array_name[*]};i++)) do if [ ${array_name[$i]} -le 6 ];then echo "${aaray_name[$i]" fi done

          • 遍历数组

            • #!/bin/bash a=(1 2 3 4 5 6) for((i=0; i<10; i++))do echo "a[$i]=${a[$i]}' done

  • 运算符

    • 算术运算符

      • 加法 expr $a+$b 减法 expr $a-$b 乘法expr $a\*$b 除法 expr $a/$b 取余 expr $a%$b 赋值a=$b 相等 [ $a == $b ] 不相等 [ $a != $b ] 需注意: 1.条件表法式需要放在方括号之间,并且要有空格。 2.使用 expr 进行计算时需要使用反引号

    • 关系运算符

      • 字符测试

        • >:大于 <;小于 ==(=)等于

      • 数值测试

        • -eq:等于 -ne不等于 -gt大于 -lt 小于 -ge大于等于 -le小于等于

    • 布尔运算符

      • -a;与 两边都为真的时候才是真的 只要有一个是假的他就是假的

        • [ $a -lt 20 -a $b -gt 100 ]

      • -o:或 两边都是假的才为假的,只要有一个为真才为真

        • [ $a -lt 20 -o $b -gt 100 ]

      • !不是

    • 逻辑运算符

      • AND 符号&&

        • [[ $a -lt 100 && $b -gt 100 ]]

      • OR 符号

        • [[ $a -lt 100 || $b -gt 100 ]]

    • 字符串运算符

      • 检测两个字符串是否相等 [$a = $b]

      • 检测两个字符串是否不相等[ $a != $b]

      • 检测字符串长度是否为0[ -z $a ]

      • 检测字符串长度是否不为 0[ -n “$a" ]

      • 检测字符串是否为空 [$a]

    • 文件测试运算符

      • -f:测试是否是普通文件 -d:测试是否是普通目录 -e:测试文件是否存在 -r:测试文件对当前用户是否可读 -w:测试文件对当前用户是否可写 -x:测试文件对当前用户是否可执行 -s:测试文件大小是否不为空(不为空是真,空为假)

    • (())我们可以直接使用双圆括弧计算其中的内容,如((var=atb)),该指令经常在ifwhile等条件判断中需要计算时使用。 let let "sum=a+b" expr expr var ='$a+$b'

      • let 和 expr 都是用于在Shell脚本中进行数值计算的工具,但它们有一些区别。 语法:let 是Shell内置的命令,使用起来比较简洁,直接在命令行中使用let后面跟上表达式即可。而 expr 是一个独立的外部命令,需要使用命令替换或管道来获取计算结果。 表达式:let 可以直接使用变量名进行计算,也可以使用 符号来引用变量。而需要使用反引号或 符号来引用变量。而‘expr‘需要使用反引号或()来将表达式括起来,并且变量需要使用$符号来引用。 返回值:let 不需要使用echo来输出计算结果,它会直接将计算结果返回给Shell。而 expr 需要使用echo来输出计算结果。 运算符:let 支持更多的数学运算符,包括加减乘除、取模、位运算等。而 expr 只支持加法、减法、乘法和取模运算。

  • 函数

    • 函数(方法) 方法名(){ } 执行方法需要调用函数,不调用不执行,调用方法直接方法名 返回值return,保存方法的值(结果)

      • jiafa() { read -p "one number" num read -p "one number2" num2 } jiafa echo "he:$?"

      • #! /bin/bash func( ){ expr $1 +$2 & /dev/null if[ $? -eq 0 ];then if [ $1 -gt $2 ];then echo"$1" return 1 else echo"$2” return 2 fi } func $1 $2

  • 控制语句

    • if语句

      • 单分支

        • If[条件];then 执行语句 fi

          • 注意:条件的内容必须为真,他才执行我们里面的语句,不过为假,里面的内容是不执行 括号内的地方要有空格,if和[]要有空格

          • #/ bin/bash a="/tmp/wholiang-shell" if[ -d $a ];then echo "you" fi

      • 双分支

        • If [ 条件];then 执行语句1 Else 执行语句2 fi 条件为真时,执行语句1,条件为假时,执行语句2

          • #/ bin/bash a="/tmp/wholiang-shell" if[ -d $a ];then echo "you" else echo "you" fi

      • 多分支

        • If [条件1];then 执行语句1 elif [条件2];then 执行语句2 elif [条件3];then 执行语句3 else 执行语句4 fi

          • 当我们进入条件时,满足哪一个,我们就执行他里面的语句

          • read -p "请输入你的成绩" a if [ $a -ge 90 ] && [ $a -le 100 ];then; echo "very good " elif [ $a -ge 70 ] && [ $a -le 89 ];then echo "good" else echo "not good" fi

    • 循环语句

      • for循环

        • C语言风格(第一个括号表示的是C,第2个括号代表的是表达式) for ((变量赋值;条件判断;增量)) do 执行语句 done 注意:增量一般情况下只有++和--

          • #! /bin/bashfor ((a=0;a<=100;a++)) do sum=$(( sum+a)) echo $sum done

        • Shell风格: for 变量名 in {list} do 执行语句 done

          • 方法一 #!/bin/bash jiSum=0 ouSum=0 for a in $( seq 1 2 100 ) do jiSum=$[ $jiSum+$a ] done echo"ji:$jiSum" for b in $( seq 2 2 100 ) do ouSum=$[ $ouSum+$b ] done echo "ou: $ouSum"

            • seq: 他是生成一个数熬另一个数之间的所有整数 seq 尾数 seq 首数(1) 尾数(100) seq 首数(1) 增量(2) 尾数(100)

          • 第二种方法 #/bin/bashi in {1..100} for do if[ $[ i%2]-eq o];then oushu=$[ $oushu + $i ] else jishu=$[ $jishu + $i ] fi done echo"ou: $oushu" echo"ji:$jishu"

      • whlie循环

        • 定义一个变量 while(条件) Do 执行语句 变量要有一个增量 done

          • #! /bin/bash cishu=0 while [ $cishu -lt 3 ] do read -p "password1:" passwd1 read -p"password2: passwd2 if["$passwd1"$passwd2”];then echo"OK" exit else echo"NO" let cishu++ fi done

        • 无限循环 while : Do 执行语句 变量要有一个增量 done

      • until循环

        • #! /bin/bash a=0 until[ ! $a-lt 10 ] do echo $a a=`expr $a + 1` done

      • continue和break Continue:跳出本次循环,后面继续循环 Break:直接跳出循环

        • #!/bin/bash var=1 while(( $var < 5 ))do if(( $var>3 ))then echo"跳出循环" break fi echo"$var" var=`expr $var + 1` done

        • #!/bin/bash var=1 while(( $var < 5 ))do if(( $var>3 ))then echo“跳出循环" continue fi echo "$var" var=`expr $var + 1` done

    • case分支语句

      • case 变量名 in 变量名1) 语句1 ;; 变量名2) 语句2 ;; *) 语句3 ;; esac

        • #/bin/bash case "$1" in 1) echo please input 1 ;; 2) echo please input 2 ;; 3) echo please input 3 ;; 4|5) echo please input 4 ;; *) echo please input 1 or 2 or 3 ;; esac

  • /dev/null文件

    • 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/nul中,/dev/nul 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/nul 文件非常有用,将命令的输出重定向到它,会起到"禁止输出”的效果

    • $command &>/dev/null

      • $num + 0 & > /dev/null

  • echo输出命令

    • echo中输出普通字符

      • 输入(带双引号):echo "it is a test“ 输入(不带引号):echo It is a test 输入(带单引号):echo 'It is a test'

    • echo中显示转义字符

      • 输入(带双引号):echo "\"it is a test“\" 输入(不带引号):echo \"It is a test\" 输出"it is a test“

    • echo中读取输入

      • read name echo "$name it is a test "

    • echo 中显示命令执行结果

      • echo `date`

    • echo -n 不换行输出

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南棋网络安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值