Loading

bash语法

  1. 按行读取文件

    # 第一种方式
    while read line
    do
    	echo $line
    done < filename(待读取的文件)
    
    # 第二种方式
    cat filename(待读取的文件) | while read line
    do
    	echo $line
    done
    
    # 第三种方式
    for line in `cat filename(待读取的文件)`
    do
    	echo $line
    done
    
  2. 一次性读取整个文件

    # 第一种方式
    value=`cat filename.txt`
    
    # 第二种方式
    value=$(<filename.txt)
    
  3. 字符串分割

    # 方式1 
    # 使用内部域分割符
    read -p "input str: " str # 读取输入的字符
    IFS=' ' # 将空格设置为分隔符
    read -ra strArr << "$str" # 将字符串读取到数组中,并由 IFS分配分隔符
    
    for i in "${strArr[@]}" # 遍历数组中元素
    do
    	echo $i
    done
    
    # 使用
    input str: a b c d
    a
    b
    c
    
    # 方式2 使用readarray命令进行字符串分割
    
    read -p "input str" str #读取字符串的值,并将分隔符设置为 : 。
    
    readarray -d : -t strArr <<<"$str" #根据设置的分隔符 : 来拆分字符串。
    
    printf "\n"
    #遍历打印输出数组中的每一个值
    for (( n=0; n < ${#strArr[*]}; n++ ))
    do
    echo "${strArr[n]}"
    done
    
    # 方式3 使用trim命令
    #!/bin/bash
    str="test;test;test" #定界符 ;
    arr=($(echo $str | tr ";" "\n"))#将定界符定义给 tr
    for i in "${arr[@]}"
    do
    echo $i
    done
    
    # 方法4
    str="1,2,3,4,5,6"
    arr=(${str//,/ })
    
    for i in ${arr[*]}
    do
      echo $i
    done
    
    
  4. bash 数组的定义声明与使用

    https://blog.csdn.net/kang19970201/article/details/87735276

    数组中的元素要用空格隔开,若用逗号隔开,则会被认为是一个整体。

    若不指定打印哪个变量,则默认打印第一个下标的变量。

    若指定下标,负数表示从后往前数,如 -1 表示倒数第一个,-3 表示倒数第三个

    普通数组

    array1=(1 2 3 4)
    array2=(1,2,3,4)
    echo $array1
    => 1
    echo $array1
    => 1,2,3,4
    
    echo $array1[2]
    => 3
    
    echo $array1[-1]
    => 4
    
    

    普通数组,自定义索引位置

    array[0]=1
    array[1]=2
    array[2]=3
    array[3]=4
    
    echo ${array[*]}
    => 1 2 3 4
    echo ${array[@]}
    => 1 2 3 4
    
    echo ${!array[@]} # 打印下标
    => 0 1 2 3
    echo ${!array[*]}
    => 0 1 2 3
    
    # 打印数组长度
    echo ${#array[*]}
    => 4
    echo ${#array[@]}
    => 4
    
    # 打印某个变量的长度
    echo ${#array[2]}
    
    

    关联数组

    关联数组支持字符串作为索引。使用关联数组必须先使用declare -A 声明它

    declare -A array
    array=([a1]=apple [a2]=pear) # a1,a2 是数组的索引,即下标。
    
    echo ${array[a1]}
    => apple
    
    echo ${array[a2]}
    => pear
    
    echo ${array[*]}
    => apple pear
    
    echo ${array[@]}
    => apple pear
    
    # 查看索引a2这个变量的长度
    echo ${#array[a2]}
    => 4
    
    
    

    数组的截取,替换

    array=(1 2 3 4 5 6)
    
    # 执行从所有数组元素中第二个元素向后截取2个元素。
    echo ${array[*]:[2:2]} 
    => 3 4
    
    echo ${array[*]:[2:4]}
    => 3 4 5 6
    
    # 替换数组的元素,并将结果返回给另一个变量
    array1=${array[*]/6/5} # 将数组array中的6替换为5,然后将替换后的结果赋值给array1
    echo ${array[*]}
    
    

    for循环遍历数组

    # 常用的三种方法
    array=(1 2 3 4 5)
    for i in ${array[*]};do
    	echo $i
    done
    
    for i in ${!array[*]};do
    	echo ${array[$i]}
    done
    
    for ((i=0; i<${#array[*]}; i++));do
    	echo ${array[$i]}
    done
    
  5. 使用source以及.的方式执行脚本,则会加载脚本中的内容并执行。脚本执行完成后,环境变量将会影响到当前进程。

  6. 根据命令执行成功或者失败执行代码块

    cmd || {
    
    }
    或者
    cmd && {
    
    }
    
    
  7. shell 内置变量

    • $UID用户ID
  8. 控制脚本的执行

    • set -e

      只要脚本中命令的返回值不为0,则立刻退出脚本的执行。

  9. 判断字符串是否包含字符串

fileName=/home/sss/data/hk

if [[ $fileName =~ "hk" ]];then
    echo "$fileName include hk"
else
    echo "not include"
fi


  1. 字符串替换

    line=`echo $line | sed 's/repo_list=//'`
    
  2. test,[],[[]], (())的区别

    • 边界都需要空格。比如 [[ $1 -eq 0 ]]

    • 字符串的比较都一样。=, ==, !=

    • test以及[]的逻辑操作符为-a 代表and, -o 代表or !

      [[]],(())的逻辑操作符为&& , ||, !

    • 只有[[]]支持通配符。

    • 整数比较操作符不一样

      • test 以及 []-eq, -gt, -lt, -ge, -le
      • [[]]任何格式都支持。
      • (())只支持>,<,=,>=,<=
  3. 字符串变量操作

    # 内容处理
    
    # 获取变量字符串
    ${str}
    
    # 获取字符串长度
    ${#str}
    
    # 截取字符串
    ${str:offset} # 从offset开始到结尾
    ${str:offset:length} # 从offset指定长度截取
    
    # 删除字符串
    ${str#world} # 删除开头处最短匹配的world子串
    ${str##world} # 删除开头处最长匹配的world子串
    ${str%world} # 删除结尾处最短匹配的world子串
    ${str%%world}# 删除结尾处最长匹配的world子串
    
    # 替换字符串
    ${str/pattern/string} # 替换第一个匹配的pattern
    ${str/pattern//string} # 替换所有匹配的pattern
    
  4. 根据变量是否定义返回字符串

    # 变量未定义则返回指定的字符,相当于默认值
    ${str:-world} # str未定义则返回world
    
    ${str:=world} # str未定义则返回world并设置它
    
    ${str:?world} # str未定义则,错误输出world并提出程序
    
    ${str:+world} # str 有定义则赋值为world, 没有定义则什么也不干。
    
    
  5. set的用法

    # 遇到不存在的变量是否忽略它执行
    set -u
    
    # 打印执行的代码
    set -x
    
    # 遇到退出码不为0则结束代码运行
    set -e
    
    # 使用管道连接命令,只要有一个命令执行失败,则整个管道执行失败。不再执行后面的命令
    set -eo pipefail
    
    
  6. select语法

    PS3="Enter a number: "  # select 提示语句
    
    select character in Sheldon Leonard Penny Howard Raj # select选项
    do
        echo "Selected character: $character" # 选择的内容
        echo "Selected number: $REPLY"        # 输入的数字ID
    done
    
  7. 获取当前路径

    #!/usr/bin/env bash
    DIR=$(cd `dirname $0`; pwd)
    
posted @ 2021-10-13 13:54  Test002  阅读(14)  评论(0)    收藏  举报