Linux下Bash脚本编写

  • Post author:
  • Post category:linux




变量


  • 定义

    a=test

  • 使用




    a

    a或






    a








    {a}


  • 定义环境变量

    export IP=12356

  • 定义只读变量

    readonly ip

  • 删除

    unset



基本知识sh


  • $n

    $1,$2可以获得传递的参数 也称为位置参数 ${10} 位置变量是从1开始的

  • #!

    一个约定的标记,告诉系统这个脚本需要什么解释器执行

  • 预先定义变量


    • $0

      脚本名 这个是包括路径的

    • $*,$@

      所有的参数

      • #*以一个单字符串显示所有向脚本传递的参数。

        如”$*“用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数。



      • @

        @ 与






        @








        *相同,但是使用时加引号,并在引号中返回每个参数。

        如”$@“用「”」括起来的情况、以”$1″ “



        2

        2″ … ”






        2


















        n” 的形式输出所有参数。

      • #*类似字符串,只有一个元素,



        @

        @类似列表,有多个元素 这个特点只在”






        @
























































        *“和”$@”中体现出来,其它时候都保持一致


    • $#

      参数的个数

    • $

      当前进程的PID

    • $!

      上一个后台进程的PID

    • $?

      显示到此位置最后执行的命令的退出状态,0表示没有错误

  • 字符串的更多操作


    • 提取

      ${string:1:4}

    • 长度

      ${#string}

  • 数组的更多操作


    • definition

      array=(value1 value2 …) array=([name]=value)关联数组

    • 访问

      ${array[n]}

    • 访问全部元素

      ${array[@]}

    • 长度

      如果数组元素为一个字符串 ${#array[0]}

    • 数组长度


      ${#array[*]}



      ${#array[@]}

  • bash执行linux原生命令,并获取返回值


    • `command`

      command代表linux命令,里面可以存在变量

    • $(command)

      只是使用的形式不一样,但是command的意义是相同的
    • 返回值是命令执行的结果

  • 关系运算符

    这个只支持数字,不支持字符串


    • -eq

      相等,

      ne

      不相等,

      gt,lt

      大于小于,

      ge,le

      大于等于或小于等于

  • 逻辑运算符

    逻辑运算符基本无差别 逻辑运算符

    !,&&,||

  • 字符串运算符


    • =,!=

      字符串是否相等

    • -z,-n

      判断字符串长度是否为0 -z为0返回true -n反之

      [-z $a]

    • =~

      正则比对

      "user" =~ ^r
    • 变量未定义或为空,在参与逻辑运算时默认为false

  • 文件测试符

    可以检测文件的状态如可读,可写等,具体使用省略

    • -d dir 判读目录是否存在

      [ -d path]
    • -f file 判断文件是否存在
    • -r|w|x file 判断是否有读执行写权限

  • 输入输出重定向


    • >

      重定向输出到某个位置,替换原有文件的所有内容。

    • >>

      重定向追加到某个位置,在原有文件的末尾添加内容。

    • <

      重定向输入某个位置文件。

    • 2>

      重定向错误输出。

    • 2>>

      重定向错误追加输出到文件末尾。

    • &>

      混合输出错误的和正确的都输出。

    • << tag

      将开始标记tag和结束标记tag之间的内容作为输入

  • 注释


    • #

      单行注释

    • :<<s

      s为任意一个字符 注释结尾要重复这个字符

  • 生成序列


    {1..254}



基本语法


  • if else
if [ condition ]
then 
    command
elif condition
then
    command
else
    command
fi
# 也可以形成一行
if condition;then echo "test";else echo "else";fi

  • for
for var in item1 item2 item3
do
    command1
    command2
    ...
done
# 另一种写法
for((i=1;i<=10;i++));
do
    command
done

  • while
int=1
while(($int<=5))
do 
    command
done
#死循环
while true
do
    command
done
#实例
while read line
do
done<ip.txt

  • until

    无限循环直到条件为true 类似while
until condition
do 
    command
done
# 简单使用
a=0
until [ ! $a -lt 10 ]
do
    echo $a
    a=`expr $a +1`
done

  • case

    ;;代表switch中的break matchV支持正则表达式
case value in
matchV)
    command
    ;;
matchV2)
    command
    ;;
esac
# 简单使用
case $value in
    1|2|3) echo 'choice 1'
    ;;
    *) echo 'choice other number'
    ;;
esac

  • break,continue

    正常使用

  • function

    • 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。
    • 函数返回值在调用该函数后通过

      $?

      来获得。
    • 调用函数时可以向其传递参数。在函数体内部,通过



      n

      (

      n

      )

      n(n为数字) 的形式来获取参数的值 和位置参数差不多,






      n


      (


      n











      )






























































      #也有

funWithReturn(){
    echo "这是一个函数"
    echo "函数的第一个参数 $1 "
    return "returnValue"
}
funWithReturn 1 2
echo "returnValue:$?"

  • . or source

    文件包含,可以理解为将另一个文件包含进来
# 简单使用
. ./test.sh
#另一种写法
source ./test.sh

  • 在脚本中调用其它解释器
/usr/bin/expect <<-EOF
    set pass 1
    set timeout 5 #设置连接反应超时时间
    spawn ssh root@192.168.1.1
    expect {
        "yes/no" { send "yes\r" ; exp_continue}
        "password:" {send "$pass\r"}
    }
    #interact 写上这个开启交互模式
    expect "#" #自动执行
        send "exit"
    expect eof
EOF



变量的数值运算


  • 整数运算

    + – * / %

    • expr 1 + 2



    • (

      (

      ((






      (


      (





      num1+$num2)) 可以使用c语言可以进行的运算




    • [

      [






      [





      num+1]

    • let sum=2+3或let i++
    • 小数运算使用bc



内置函数


  • echo


    • -e

      开启转义,也就是说\n可以被当成换行

    • 显示命令执行的结果

      echo

      date

  • read

    read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 read name

    • -p 输入提示文字
    • -n 输入字符长度限制(达到6位,自动结束)
    • -t 输入限时
    • -s 隐藏输入内容

  • printf

    使用printf的移植性要比echo要好,printf和c语言的printf类似


    • 格式

      printf format-string [arguments…],format-string: 为格式控制字符串 arguments:为参数列表。

  • let

    Bash函数可以用来给变量自增

  • exit

    退出程序



经常使用Linux命令


  • seq

    创建序列

    for var in `seq 10`

  • grep

    字符串匹配命令 可以使用正则表达式,对输入内容的每一行进行匹配 返回匹配成功的行

    • -v 不包括 反向

  • sed

    基本用法 对输入字符进行操作


    • a,i,c,d,p,s

      a代表后面新增一行,i代表在前面新增一行,c代表替换,d代表删 p代表打印 s取代可以使用正则表达式

    • 数据的搜寻替换,显示等


      sed 's/正则/content/g'

      g代表行内全局替换,i代表忽略大小写,和正则一样

    • 搜索


      sed '/root/p'

      可以使用正则表达式,也可以换其它参数

    • sed '2c Test'

    • -e

      多点编辑

      sed -e '3,$d' -e 's/bash/blueshell/'

  • wc

    计算行数,字节数,单词数


    • -clw

      c字节数 l行数 w单词数

  • awk

    文本分析工具 里面的写法类似c语言,可以使用正则表达式匹配


    • BEGIN{},{},END{}

      ,{}代表进行中,BEGIN{}代表开始前执行的,END{}结束执行

    • awk -va=1 '{print $1,$1+a}' log.txt

    • awk -F, '{print $1,$2}' log.txt

  • expect

    一个自动化的交互工具 可以实现很多操作,例如远程连接自动操作



常用全局环境变量(系统变量)

  • $HOME home目录路径
  • $SHELL shell解释器路径
  • $LANG 操作系统语言和编码
  • $RANDOM 随机生成 0~32767之间的整数数字
  • $PATH 定义解释器搜索用户执行命令的路径



注意

  • bash不支持简单的

    数学运算

    ,可以通过其他的linux命令实现如

    expr



    awk

    val=`expr 2 + 2` 中间要加空格


    • expr

      expr的简单运算包括+,-,*,/,% 使用*号时要加上\*(这里为了配合markdown语法多写了几个)

  • 并发执行

    不影响当前shell

    {command}&

    &在linux中代表后台执行

  • /dev/null

    如果将输出写到这里将会被丢弃



版权声明:本文为qq_43481447原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。