Shell(变量操作)

Posted by YaPi on March 2, 2022

变量

  • 不做特殊声明,shell中的变量都是全局变量
    • 定义在函数内部的变量,需要调用过后才会生效
  • 使用local关键字,定义局部变量
    • local var1=xxx
  • 在函数内部的变量会自动覆盖函数外部的同名变量

变量替换

将变量按照匹配规则进行匹配,匹配到则删除前面的数据

规则 解释
${变量#匹配规则} 从头开始匹配,非贪婪模式
${变量##匹配规则} 从头开始匹配,贪婪模式
${变量%匹配规则} 从尾开始匹配,非贪婪模式
${变量%%匹配规则} 从尾开始匹配,贪婪模式
${变量/旧字符串/新字符串} 替换变量中旧字符串为新字符串,非贪婪模式
${变量//旧字符串/新字符串} 替换变量中旧字符串为新字符串,贪婪模式

例:

是直接匹配字符,不是查找字符,比如 "abc",使用 ${var1:#b},不会删除b,需要全部匹配

value="I love you , Do you love me"
value1=${value#*ve} # you,Do you love me
value2=${value##*ve} # me
value3=${value%%ve*} # I lo
value4=${value%ve*} # I love you,Do you lo
value5=${value/love/f} # I f you,Do you love me
value6=${value//love/fuck}  # I f you,Do you f me

变量测试

用的较少 一般用if/else替换

avatar

有类型变量

declare 和 typeset命令

  • declare和typeset两者等价
  • declare和typeset都是用来定义变量类型的
参数 含义
-r 将变量设为只读
-i 将变量设为整数
-a 将变量定义为数组
-f 显示此脚本前定义过的所有函数及内容
-F 仅显示此脚本前定义过的函数名
-x 将变量声明为环境变量,任何脚本内就都可以是用了

如果需要取消,把 ‘-‘ 号变为 ‘+’ 号就行了

# 定义为只读
declare -r var1="hello world"

# 设置为整数 不设置加号默认是字符串相加
declare -i num2
num2=$num1+10

# 设置数组 中间以空格分割,不是逗号
declare -a array1=("jones" "mike" "kobe" "jordan")

# 输出数组内容 下标从0开始
echo ${array1[@]} # 输出全部内容
echo ${array1[1]} # 输出下标索引为1的内容
# 获取数组长度
echo ${#array1}  # 数组内元素个数
echo ${#array1[2} # 数组内下标索引为2的元素的长度
# 给数组某个下标赋值
array1[0]="123"  
array1[20]="123" # 在数组尾部添加一个新元素
# 删除元素
unset array1[2] # 清除元素
unset array1   # 清空整个数组
# 分片访问
${array1[@]:1:2} # 显示数组下标索引从1开始到3个元素
# 内容替换
${array1[@]/an/AN} # 替换元素an为AN
# 数组遍历
for v in ${array1[@]}
do
  echo $v
done

变量运算

推荐 运算使用$(()), 比较大小时使用 expr 使用转译字符转译。expr只能对整数进行运算

  • expr $num1 operator $num2
    • echo expr $num1 \< $num2
  • $(($num1 operator $num2))

输入一个整数,然后计算1+2+3…的合

#!/bin/bash

while [ true ]; do
  read -p "pls input a num: " num
  # 判断是否为数字的小技巧
  # 进行相加运算,返回0则不是数字
  # 并将结果舍弃
  expr $num + 1 &> /dev/null
  # 判断上次返回是否为0
  if [ $? -eq 0 ]; then
      # 判断是否大于0
      # 若expr执行大于0会返回1
      if [ `expr $num \> 0` -eq 1 ]; then
          for((i=1;i<=$num;i++))
          do
            # $sum要在前面
            # = 号左右不能有空格
            sum=`expr $sum + $i`
          done 
          echo "1+2+3... + $num = $sum  "
          exit
      fi
  fi
  echo "pls input num!"
  continue 
done
bc

可以进行浮点数运算

  • echo “23.3+35” bc
  • 指定保留小数位数
    • echo “scale=4;1/3” bc