Shell脚本示例代码

前端之家收集整理的这篇文章主要介绍了Shell脚本示例代码前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. #! /bin/bash
  2.  
  3. # echo和printf的用法
  4.  
  5. # echo是用于终端打印的基本命令.在默认情况下,echo在每次调用后会添加一个换行符
  6. echo "hello,beijing"
  7. echo "$(pwd)"
  8. echo '$(pwd)' # 结果并不是希望得到的,将会输出: $(pwd)
  9. echo $(pwd) # 输出结果同 echo "$(pwd)"
  10.  
  11. # 在默认情况下,echo会将一个换行符追加到输出文本的尾部.可以使用标志”-n”来忽略结尾的换行符
  12. echo -n what is your name?
  13. echo 'hello,spring'
  14.  
  15. # 如果需要使用转义序列,则采用echo -e 这种形式
  16. echo -e "1\t2\t3"
  17. echo "\"china beijing\""
  18.  
  19. # 显示结果定向至文件
  20. echo "csdn blog: https://blog.csdn.net/fengbingchun" > a.txt
  21.  
  22. # 反引号用于执行命令
  23. echo "date: `date`"
  24.  
  25. # printf是另一个可用于终端打印的命令,它使用的参数和C语言中的printf函数一样
  26. # 默认printf不会像echo自动添加换行符,我们可以手动添加\n
  27. # %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来
  28. printf "hello,world\n"
  29. printf "%-5s %-10s %-4s\n" No Name Mark
  30. printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
  31. printf "%-5s %-10s %-4.2f\n" 2 James 90.9989
  32. printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564
  33.  
  34. val=5
  35. printf "val: %d\n" ${val}
  1. #! /bin/bash
  2.  
  3. # 输入输出重定向的使用
  4.  
  5. # 重定向一般通过在命令间插入特定的符号来实现
  6. # command > file : 将输出重定向到file
  7. # command < file : 将输入重定向到file
  8. # command >> file : 将输出以追加的方式重定向到file
  9. # n > file : 将文件描述符为n的文件重定向到file
  10. # n >> file : 将文件描述符为n的文件以追加的方式重定向到file
  11. # n >& m : 将输出文件m和n合并
  12. # n <& m : 将输入文件m和n合并
  13. # << tag : 将开始标记tag和结束标记tag之间的内容作为输入
  14. # 文件描述符0通常是标准输入(STDIN),1是标准输出(STDOUT),2是标准错误输出(STDERR)
  15.  
  16. if [ $# != 1 ]; then
  17. echo "usage: $0 file_name"
  18. echo "e.g: $0 ./a.txt"
  19. exit 1
  20. fi
  21.  
  22. # 输出重定向:注意任何${1}内的已经存在的内容将被新内容替代.如果要将新内容添加文件末尾,需要使用>>操作符
  23. echo `who` > ${1}
  24. echo `pwd` >> ${1}
  25.  
  26. # 输入重定向
  1. #! /bin/bash
  2.  
  3. # 参数的使用
  4.  
  5. # 我们可以在执行Shell脚本时,向脚本传递参数,脚本内获取参数的格式为:$n. n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,以此类推
  6.  
  7. if [ $# != 3 ]; then
  8. echo "usage: $0 param1 param2 param3"
  9. echo "e.g: $0 1 2 3"
  10. exit 1
  11. fi
  12.  
  13. echo "执行文件名: $0"
  14. echo "param1: $1"; echo "param2: $2"; echo "param3: $3"
  15.  
  16. # 特殊字符用来处理参数
  17. # $#: 传递到脚本的参数个数
  18. echo "参数个数为: $#"
  19. # $*: 以一个单字符串显示所有向脚本传递的参数
  20. echo "传递的参数作为一个字符串显示: $*"
  21. # $@: 与$*相同,但是使用时加引号,并在引号中返回每个参数
  22. echo "传递的参数作为字符串显示: $@"
  23.  
  24. for i in "$*"; do # 循环一次
  25. echo "loop"; echo $i
  26. done
  27.  
  28. echo ""
  29. for i in "$@"; do # 循环三次
  30. echo "loop"; echo $i
  31. done
  1. #! /bin/bash
  2.  
  3. # 变量的用法
  4.  
  5. # 脚本语言通常不需要在使用变量之前声明其类型.只需要直接赋值就可以了.在Bash中,每一个变量的值都是字符串
  6. # 无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储.
  7. # 有一些特殊的变量会被shell环境和操作系统环境用来存储一些特别的值,这类变量被称为环境变量
  8.  
  9. # 变量名的命名须遵循如下规则:
  10. # 变量名和等号之间不能有空格;命名只能使用英文字母,数字和下划线,首个字符不能以数字开头;
  11. # 中间不能有空格,可以使用下划线"_"; 不能使用标点符号; 不能使用bash里的关键字.
  12.  
  13. # 运行shell时,会同时存在三种变量
  14. # 局部变量:在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
  15. # 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行.必要的时候shell脚本也可以定义环境变量
  16. # shell变量:是由shell程序设置的特殊变量.shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
  17.  
  18. # 如果value不包含任何空白字符(如空格),那么它不需要使用引号进行引用,反之,则必须使用单引号或双引号
  19. var=value # var = value 是错误的,"="两边不能有空格
  20.  
  21. # 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
  22. # 推荐给所有变量加上花括号
  23. echo $var # 注意echo $(var) 是错误
  24. echo ${var}
  25.  
  26. fruit=apple
  27. count=5
  28. echo "We have $count ${fruit}(s)"
  29.  
  30. # 已定义的变量,可以被重新定义
  31. var=1234567890
  32. echo ${#var} # 获得变量值的长度
  33.  
  34. # 环境变量
  35. echo "PATH: ${PATH}"
  36. echo "HOME: ${HOME}"
  37. echo "PWD: ${PWD}"
  38. echo "USER: ${USER}"
  39. echo "UID: ${UID}"
  40. echo "SHELL: ${SHELL}"
  41.  
  42. # 除了显式地直接赋值,还可以用语句给变量赋值
  43. # 将 /etc 下目录的文件名循环出来
  44. for file in `ls /etc`; do
  45. echo ${file}
  46. done
  47.  
  48. for file in $(ls .); do
  49. echo ${file}
  50. done
  51.  
  52. # 只读变量:使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变
  53. readonly var; #var=2 # Error: var: readonly variable
  54.  
  55. # 删除变量:使用unset命令可以删除变量,变量被删除后不能再次使用。unset命令不能删除只读变量
  56. unset count; echo "count: ${count}"
  57. unset var; echo "var: ${var}" # Error: var: cannot unset: readonly variable
  1. #! /bin/bash
  2.  
  3. # 字符串的使用
  4.  
  5. # 字符串可以用单引号,也可以用双引号,也可以不用引号
  6.  
  7. # 单引号:
  8. str='this is a string'; echo "${str}"
  9. # 单引号字符串的限制:
  10. # 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
  11. # 单引号字串中不能出现单引号(对单引号使用转义符后也不行)
  12. echo '${str}' # print: ${str}
  13.  
  14. # 双引号: 双引号里可以有变量;双引号里可以出现转义字符
  15.  
  16. # 拼接字符串
  17. var1="hello"; var2="beijing"
  18. var3="hi,${var1},${var2}!"; echo "${var3}"
  19.  
  20. # 获取字符串长度
  21. echo "var3 length: ${#var3}"
  22.  
  23. # 抓取子字符串
  24. # 从var3字符串第2个字符开始截取4个字符
  25. echo "${var3}"; echo "${var3:1:4}"
  26.  
  27. # 查找子字符串: 注意:找出字符串中字符第一次出现的位置,若找不到则expr index返回0. 注意它匹配的是字符而非字符串
  28. echo "${var3}"; echo `expr index "${var3}" i`
  1. #! /bin/bash
  2.  
  3. # 运算符的使用
  4.  
  5. # expr是一款表达式计算工具,使用它能完成表达式的求值操作,可以用于基本算数操作
  6. # 注意:表达式和运算符之间要有空格; 完整的表达式要被` `包含
  7. val1=3; val2=5
  8. val=`expr ${val1} + ${val2}`
  9. echo "val = ${val}"
  10.  
  11. # let命令可以直接执行基本的算数操作.当使用let时,变量名之前不需要再添加”$”.
  12. # 操作符”[]”的使用方法和let命令类似.也可以使用”(())”,但使用”(())”时,变量名之前需要加上$
  13. let ret=val1+val2
  14. echo "ret: ${ret}"
  15.  
  16. ret=$((val1*val2))
  17. echo "ret: ${ret}"
  18.  
  19. # expr和let都不支持浮点运算,bc支持浮点运算
  20. ret=`echo "${val1} * 1.5" | bc`
  21. echo "ret: ${ret}"
  22.  
  23. # 算术运算符:+、-、×、/、%、=、==、!=
  24. # 注意:条件表达式要放在方括号之间,并且要有空格;乘号(*)前边必须加反斜杠(\)才能实现乘法运算
  25. val=`expr ${val1} \* ${val2}`
  26. echo "val = ${val}"
  27.  
  28. if [ ${val1} == ${val2} ]; then
  29. echo "${val1} 等于 ${val2}"
  30. else
  31. echo "${val1} 不等于 ${val2}"
  32. fi
  33.  
  34. # 关系运算符: -eq、-ne、-gt、-lt、-ge、-le,返回true或false
  35. # 注意:关系运算符只支持数字,不支持字符串,除非字符串的值是数字
  36. if [ ${val1} -lt ${val2} ]; then
  37. echo "${val1} 小于 ${val2}"
  38. else
  39. echo "${val1} 不小于 ${val2}"
  40. fi
  41.  
  42. # 布尔运算符: !(非)、-o(或)、-a(与),返回true或false
  43. if [ ${val1} -eq ${val2} -o ${val1} -lt ${val2} ]; then
  44. echo "${val1} 等于或小于 ${val2}"
  45. else
  46. echo "${val1} 大于 ${val2}"
  47. fi
  48.  
  49. # 逻辑运算符:&&、||,返回true或false
  50. val3=2
  51. if [[ ${val1} -gt ${val3} && ${val2} -ge ${val3} ]]; then # 注意:这里要用两个[[ ]]
  52. echo "${val1} > ${val3} 且 ${val2} >= ${val3}"
  53. else
  54. echo "${val1} <= ${val3} 且 ${val2} < ${val3}"
  55. fi
  56.  
  57. # 字符串运算符:=、!=、-z(检测字符串长度是否为0,为0返回true)、-n(检测字符串长度是否为0,不为0返回true)等
  58. str1="abc"; str2="def"; str3=""
  59. if [ ${str1} != ${str2} ]; then
  60. echo "${str1} != ${str2}"
  61. else
  62. echo "${str1} == ${str2}"
  63. fi
  64.  
  65. if [ -z ${str3} ]; then
  66. echo "${str3} 长度为0"
  67. fi
  68.  
  69. if [ -n ${str1} ]; then
  70. echo "${str1} 长度不为0"
  71. fi
  72.  
  73. if [ ${str1} ]; then
  74. echo "${str1} 不为空"
  75. fi
  76.  
  77. # 文件测试运算符:用于检测Unix文件的各种属性
  78. # -b file: 检测文件是否是块设备文件,如果是,则返回 true
  79. # -c file: 检测文件是否是字符设备文件,如果是,则返回 true
  80. # -d file: 检测文件是否是目录,如果是,则返回 true
  81. # -f file: 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true
  82. # -g file: 检测文件是否设置了 SGID 位,如果是,则返回 true
  83. # -r file: 检测文件是否可读,如果是,则返回 true
  84. # -w file: 检测文件是否可写,如果是,则返回 true
  85. # -x file: 检测文件是否可执行,如果是,则返回 true
  86. # -s file: 检测文件是否为空(文件大小是否大于0),不为空返回 true
  87. # -e file: 检测文件包括目录)是否存在,如果是,则返回 true
  88. file="./operator_usage.sh"
  89. if [[ -r ${file} && -w ${file} && -x ${file} && -s ${file} && -e ${file} ]]; then
  90. echo "${file} 是可读、可写、可执行的,文件不为空,文件存在 "
  91. fi
  92.  
  93. if [ -f ${file} ]; then
  94. echo "${file} 是普通文件"
  95. fi
  96.  
  97. dir="../Samples_Shell"
  98. if [ -d ${dir} ]; then
  99. echo "${dir} 是目录"
  100. fi
  101.  
  102. # test命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
  103. if test ${val1} -le ${val2}; then
  104. echo "${val1} <= ${val2}"
  105. fi
  106.  
  107. if test ${str1} != ${str2}; then
  108. echo "${str1} != ${str2}"
  109. fi
  110.  
  111. if test -r ${file}; then
  112. echo "${file} 可读"
  113. fi
  1. #! /bin/bash
  2.  
  3. # if、for、while、case的使用
  4.  
  5. # if
  6. val1=5; val2=10
  7. if [ ${val1} == ${val2} ]; then
  8. echo "${val1} == ${val2}"
  9. elif [ ${val1} -gt ${val2} ]; then
  10. echo "${val1} > ${val2}"
  11. else
  12. echo "${val1} < ${val2}"
  13. fi
  14.  
  15. # for
  16. arr=(1 2 3 4 5)
  17. for val in ${arr[@]}; do
  18. echo "val ${val}"
  19. done
  20.  
  21. # while
  22. val=1
  23. while (( ${val} <= 5 )); do # 注意是两个(( ))
  24. echo "val: ${val}"
  25. let val++
  26. done
  27.  
  28. # until: 执行一系列命令直至条件为true时停止
  29. val=1
  30. until [ ! ${val} -lt 5 ]; do
  31. echo "val: ${val}"
  32. val=`expr ${val} + 1`
  33. done
  34.  
  35. # case
  36. val=4 # 2
  37. case ${val} in
  38. 1) echo "val = 1" ;;
  39. 2) echo "val = 2" ;;
  40. 3) echo "val = 3" ;;
  41. *) echo "val is other value" ;;
  42. esac
  43.  
  44. # break
  45. for val in ${arr[@]}; do
  46. echo "val: ${val}"
  47. if [ ${val} == 2 ]; then
  48. break
  49. fi
  50. done
  51.  
  52. # continue
  53. for val in ${arr[@]}; do
  54. if [ ${val} == 2 ]; then
  55. continue
  56. fi
  57. echo "val: ${val}"
  58. done
  1. #! /bin/bash
  2.  
  3. # 数组的使用
  4.  
  5. # bash支持一维数组(不支持多维数组),初始化时不需要定义数组大小,并且没有限定数组的大小。
  6. # 类似与C语言,数组元素的下标由0开始编号.获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0.
  7.  
  8. # 定义数组:在Shell中,用括号来表示数组,数组元素用"空格"符号分割开
  9. arr=(hi bei jing)
  10. echo "${arr[0]} ${arr[1]} ${arr[2]}"
  11. # 也可以单独定义数组的各个分量
  12. arr[1]="tian"
  13. # 读取数组
  14. echo "${arr[0]} ${arr[1]} ${arr[2]}"
  15. # 使用@符号可以获取数组中的所有元素
  16. echo "${arr[@]}"
  17.  
  18. # 获取数组的长度
  19. echo "length: ${#arr[@]}" # 3
  20. echo "length: ${#arr[*]}" # 3
  21. # 取得数组单个元素的长度
  22. echo "sub length: ${#arr[2]}"
  23.  
  24. # 获取数组所有元素的长度
  25. length=0
  26. for i in "${arr[@]}"; do
  27. let length+=${#i}
  28. done
  29. echo "all length: ${length}"
  1. #! /bin/bash
  2.  
  3. # 函数的使用
  4.  
  5. # 可以带function fun()定义,也可以直接fun()定义,不带任何参数
  6. # 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值
  7. fun1() {
  8. echo "this is a shell function!"
  9. }
  10.  
  11. echo "调用fun()函数"
  12. # 注意:调用函数仅使用其函数名即可;所有函数在使用前必须定义
  13. fun1
  14.  
  15. #
  16. val=5
  17. echo "val: ${val}"
  18.  
  19. fun2() {
  20. let val=val+5
  21. }
  22.  
  23. fun2
  24. echo "val: ${val}"
  25.  
  26. # 函数返回值在调用函数后通过$?来获得
  27. fun3 () {
  28. val1=20; val2=30
  29. let val3=val1+val2
  30. return ${val3}
  31. }
  32.  
  33. fun3
  34. echo "${val1} + ${val2} = $?"
  35.  
  36. # 函数参数
  37. fun4() {
  38. echo "第一个参数为: ${1}"
  39. echo "第二个参数为: ${2}"
  40. echo "参数总数有 $# 个"
  41. echo "作为一个字符串输出所有参数: $*"
  42. let val=${1}+${2}
  43. echo "val: ${val}"
  44. }
  45.  
  46. fun4 -5 -10
  1. #! /bin/bash
  2.  
  3. # 读取txt文件并分析
  4.  
  5. if [ $# != 2 ]; then
  6. echo "usage: $0 src_txt_file dst_txt_file"
  7. echo "e.g: $0 ./a.txt ./b.txt"
  8. exit 1
  9. fi
  10.  
  11. # 读指定的txt文件,并将每行打印输出
  12. echo "1." >> "$2"
  13. while IFS='' read -r line || [[ -n "$line" ]]; do
  14. echo "Text read from file: $line" >> "$2"
  15. done < "$1"
  16.  
  17. # 判断每行中是否含有指定字符,对满足条件的行写入指定的文件
  18. echo "2." >> "$2"
  19. sub="88"
  20. while IFS='' read -r line || [[ -n "$line" ]]; do
  21. if [[ "$line" != "${line%$sub*}" ]]; then
  22. echo "${line}" >> "$2"
  23. fi
  24. done < "$1"
  25.  
  26. # 如果每行字符长度大于5,则移除每行中最后5个字符,并写入指定的文件
  27. echo "3." >> "$2"
  28. value=5
  29. while IFS='' read -r line || [[ -n "$line" ]]; do
  30. length=${#line}
  31. #echo "length: ${length}"
  32. if [[ "${length}" -ge "${vale}" ]]; then
  33. echo "${line::-${value}}" >> "$2"
  34. fi
  35. done < "$1"
  36.  
  37. # 如果每行字符长度大于10,则移除每行中最前10个字符,并写入指定的文件
  38. echo "4." >> "$2"
  39. value=10
  40. while IFS='' read -r line || [[ -n "$line" ]]; do
  41. length=${#line}
  42. if [[ "${length}" -ge "${vale}" ]]; then
  43. echo "${line:${value}}" >> "$2"
  44. fi
  45. done < "$1"
  46.  
  47. # 判断每行中是否含有指定字符,若有则用指定的字符替换原有的字符,并写入指定的文件
  48. echo "5." >> "$2"
  49. sub1="group"; sub2="class"
  50. while IFS='' read -r line || [[ -n "$line" ]]; do
  51. if [[ "$line" != "${line%$sub1*}" ]]; then
  52. echo ${line} | sed -e "s/${sub1}/${sub2}/g" >> "$2"
  53. fi
  54. done < "$1"
  1. #! /bin/bash
  2.  
  3. # 读取目录文件并分析
  4.  
  5. if [ $# != 2 ]; then
  6. echo "usage: $0 src_directory dst_txt_file"
  7. echo "e.g: $0 ./a ./a.txt"
  8. exit 1
  9. fi
  10.  
  11. # 遍历指定目录(当前层)下所有文件和目录,并写入指定txt文件
  12. echo "1." >> $2
  13. for name in `ls $1`; do
  14. echo "name: ${name}" >> $2
  15. done
  16.  
  17. # 遍历指定目录下所有文件包括子目录下的所有文件,并写入指定txt文件
  18. echo "2." >> $2
  19. for name in $(find $1 -type f -name "*"); do
  20. echo "${name}" >> $2
  21. done
  22.  
  23. # 遍历指定目录下所有目录,包括子目录,并写入指定txt文件
  24. echo "3." >> $2
  25. for name in $(find $1 -type d -name "*"); do
  26. echo "${name}" >> $2
  27. done
  28.  
  29. # 遍历指定目录下的所有文件包括子目录下的所有文件,按要求修改文件名字,并写入指定txt文件
  30. echo "4." >> $2
  31. name1="xxx"; name2="yyy"
  32. for name in $(find $1 -type f -name "*${name1}*"); do
  33. new_file_name=$(echo ${name} | sed -e "s/${name1}/${name2}/g")
  34. echo "${new_file_name}" >> $2
  35.  
  36. mv ${name} ${new_file_name}
  37. done
  38.  
  39. # 遍历指定目录下的所有*.cpp文件,仅将.cpp文件名字并写入指定txt文件,不包括名字前面的路径
  40. echo "5." >> $2
  41. name=`find ${1} -type f -name "*.cpp" -printf "%f\n"` # 注意:需要将-printf放在-name的后面,否则将会查找指定目录下的所有文件
  42. echo "${name}" >> ${2}
  43.  
  44. # 遍历指定目录下带有Samples_*名字的子目录,仅将子目录下带有*.cpp的文件写入指定txt文件,不包括名字前面的路径,并且每个名字单独占一行
  45. echo "6." >> ${2}
  46. for name in $(find ${1} -type d -name "Samples_*"); do
  47. echo "dir name: ${name}" >> ${2}
  48. echo `find ${name} -type f -name "*.cpp" -printf "%f\n"` | tr " " "\n" >> ${2}
  49. done

以上脚本主要参考:http://www.runoob.com/linux/linux-shell.html

GitHub:  https://github.com/fengbingchun/Linux_Code_Test

猜你在找的Bash相关文章