Bash Programming

说来惭愧从来没系统看过Bash-Script

Posted by tianchen on November 21, 2019

Bash

参考了简书-Bash

以及This Tutorial

Basics

  • Shell本身就是在OS和用户之间的一个命令解释器
  • 起手 #!/bin/bash选择bash作为解释器
  • 可以直接 bash hello.sh或者先赋予可执行权限chmod a+x ./hello.sh然后直接./hello.sh
  • 变量可以直接定义(类似Python)但是注意“=”左右不能有空格(类似bashrc嘛)
  • 本质上变量都是字符串
    • 只有当变量为纯数字的时候才可以被认为是“数字变量”,否则都是字符串
    • d=${c/BB/12}可以替换c中的BB为12
    • 注意数字变量和字符变量的区别
      • 数字变量用 $a -ge $b 这样的模式来比较
      • 字符串变量用 $a = $b这样的链接
  • 引用变量用 ${my_var}大括号也可以不加
  • 单引号内部的内容会被全部输出(不会带转义)但是双引号之间的可以
    • echo出一个变量要么不用引号要么双引号
  • ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *

  • 条件语句
if [ condition1 ]
then
    command1
elif [ condition2 ]
    command2
else
    commandN
fi
  • 循环语句

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

while [ condition ]
do
    command
done

  • 数组

arr=(1 2 3 5 8 13)

total={#arr[*]}
echo "Num of Elements:"${total}

echo "Array Values:"
for var in ${arr[*]}; do
        printf "%d " ${var}
done

echo "Array Value with Index"
for key in ${!arr[*]}; do
        printf "%d: %s\n " ${key} ${arr[${key}]}
done

  • 循环,range

for i in (sed 0 ${END); do echo ${i}; done

for ((int i; i<10; i++)) do
    echo $i
done
  • 遍历某文件夹下的文件
for filename in ./*.mp3; do
    echo $filename
done

字符串

  • ${#string} $string的长度
  • ${string:position} 在$string中, 从位置$position开始提取子串至屁股
  • ${string:position:length} 在$string中, 从位置$position开始提取长度为$length的子串
  • ${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring
  • ${string//substring/replacement} 使用$replacement, 来代替最后一个匹配的$substring
  • expr match $string "\(re\)"