翼度科技»论坛 云主机 LINUX 查看内容

Shell脚本基础知识-初步版

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
本文是笔者研究生期间在阅读《Linux命令行与shell脚本编程大全》之后总结出来的一些重点知识的记录,在此重新整理输出。以便在给上个帖子 涉及到的相关知识点进行一下讲解,帮助自己复习
shell脚本的首行规范化应该是
  1. #!/bin/bash  
  2. # function description
复制代码
其中第一行必须如此,#后面的惊叹号会告诉shell用哪个shell来运行脚本,第二行是本脚本的功能说明。
一. 引用变量与数组

● 当进行变量赋值后,要引用这个变量,则要用 $符号,而如果要某个命令的结果进行赋值则要用 $()
● 变量名称区分大小写,赋值的=前后不能有空格
  1. days=10
  2. guest="Katie"
  3. echo "$guest checked in $days days ago"
  4. #!/bin/bash
  5. testing=$(date)
  6. echo "The date and time are: " $testing
复制代码
●  一维数组,即向量,空格隔开,下标读取, */@读取所有元素
  1. array_name=(value0 value2 value3)
  2. # 数组使用
  3. my_array=(A B C D)
  4. echo "数组的元素为: ${my_array[*]}
  5. echo "数组的元素为: ${my_array[@]}
  6. echo "数组的元素个数为: ${#my_array[@]}"
复制代码
● 重定向输入输出
  1. #### 输出重定向
  2. > # 保存
  3. >> # 追加保存,不覆盖
  4. #### 输入重定向,也就是将 file 作为参数 发给这个命令,比如下面,
  5. # wc命令可以对对数据中的文本进行计数
  6. wc < file1
复制代码
● 管道 |  :一个命令的输出作为另一个命令的输入
rpm -qa | sort > rpm.list
● 其他
  1. # 命令替换
  2. for i in `seq 1 10`
  3. `expr 2+2`
  4. #### echo read printf test命令
  5. echo "It is a test"
  6. echo ""It is a test"" # 转义
  7. #!/bin/sh
  8. read name # 从标准输入中读取参数赋给name变量
  9. echo "$name It is a test"
  10. echo -e "OK! \n"  # -e 开启转义
  11. echo "It is a dog" > myfile
  12. printf "%-10s %-8s %-4s.2f\n" 郭靖 男 66.1234
复制代码
二. 流程控制

2.1 for循环
  1. ## for循环
  2. for loop in `seq 1 5` # 命令替换
  3. do
  4.   echo "The value is: $loop"
  5. done
  6. #或者一条命令
  7. for var in item1 item2 item3;do echo $var;done
  8. # while循环
  9. while condition
  10. do
  11.   command
  12. done
  13. #### 示例小脚本
  14. for i in (seq 1 22) X Y M;do cat chr{i}.fa >>hg38.fa;done # () 都是做命令替换的 {}是做变量替换的
  15. for i in `seq 1 12`;do cut -f 6,9 w${i}_transcript.gtfs >w${i}.txt;done
  16. for i in `seq 1 12`;do sort w${i}.txt >w${i}.gtf;done
  17. for i in `cat list.txt`;do grep -w $i whole.gff3|awk '$3=="gene"' >>result.txt;done
复制代码
2.2 if-else类
  1. ### shell流程控制
  2. # 判断 只有第一个 command正常成功执行,返回退出码0的语句中的then的 command2才会被执行
  3. if command1
  4. then
  5.           command2
  6.     command3
  7. fi
  8. # 另一种形式
  9. if command; then
  10.   commands
  11. fi
  12. # if-then-else 语句
  13. if command
  14. then
  15.    command2
  16. else
  17.    command3
  18. fi
  19. # 嵌套if
  20. if grep $testuser /etc/passwd
  21. then
  22.    echo "The user $testuser exists on this system."
  23. else
  24.    echo "The user $testuser does not exist on this system."
  25.    if ls -d /home/$testuser/
  26.    then
  27.       echo "However, $testuser has a directory."
  28.    fi
  29. fi
  30. # elif
  31. if command1
  32. then
  33.    commands
  34. elif command2
  35. then
  36.     more commands
  37. fi
复制代码
2.3 if中对条件的判断
除了 正常执行某个命令之外,还可以用 test  和  [ condation ]  两种形式来判断,判断条件有数值比较 字符串比较 文件比较
  1. ### 更一般性的判断语句,而不只是以command是否成功执行为判断依据
  2. # test condition # 检查某个表达式是否成立;test可以判断 数值比较 字符串比较 文件比较
  3. if test conditon #
  4. then
  5. fi
  6. if [ condition ] # 另一种方式
  7. then
  8. fi
复制代码
●  数值比较  左边 对于右边的关系
-eq        相等
-ge        大于或等于
-gt         大于
-le        小于或等于
-lt        小于
-ne         不等于
● 字符串比较
-n        长度非0
-z        长度为0
=        相同
!=        不同
>        大
<        小
test比较数值用 文本代码(eq,lt)来比较,而比较字符串用 标准数学符号(>=)来比较,比较字符串使用标准的ASCII码顺序,数值< 大写字母< 小写字母
  1. # 节选自 《linux命令行与shell脚本大全》第三版 P245
  2. # -n -z 检查一个变量是否含有数据 可以用来判断 自己写的shell程序的命令行参数是否完备
  3. cat test10.sh
  4. $ cat test10.sh
  5. #!/bin/bash
  6. # testing string length
  7. val1=testing
  8. val2=''
  9. #
  10. if [ -n $val1 ]
  11. then
  12.         echo "The string '$val1' is not empty"
  13. else
  14.         echo "The string '$val1' is empty"
  15. fi
  16. #
  17. if [ -z $val2 ]
  18. then
  19.         echo "The string '$val2' is empty"
  20. else
  21.         echo "The string '$val2' is not empty"
  22. fi
  23. #
  24. if [ -z $val3 ]
  25. then
  26.         echo "The string '$val3' is empty"
  27. else
  28.         echo "The string '$val3' is not empty"
  29. fi
  30. $
  31. $ ./test10.sh
  32. The string 'testing' is not empty
  33. The string '' is empty
  34. The string '' is empty
  35. $
复制代码
●  文件比较
-d file          检查file是否存在并是一个目录
-e file         检查file是否存在
-f file         检查file是否存在并是一个文件
file1 -nt file2         检查file1是否比file2新
file1 -ot file2         检查file1是否比file2旧
更多参见 P246 12.4.3
● 复合条件测试
[ condtion1 ] && [ condtion2 ]
[ condtion1 ] || [ condtion2 ]
2.4 Case
  1. # case
  2. case variable in
  3. pattern1 | pattern2) commands1;;
  4. pattern3) commands2;;
  5. *) default commands;;
  6. esac
复制代码
例子
  1. case $USER in
  2. rich | barbara)
  3. echo "Welcome, $USER"
  4. echo "Please enjoy your visit";;
  5. testing)
  6. echo "Special testing account";;
  7. jessica)
  8. echo "Do not forget to log off when you're done";;
  9. *)
  10. echo "Sorry, you are not allowed here";;
  11. esac
复制代码
三.处理命令行输入参数

在命令行获取参数,默认的 执行脚本被认为是 $0,那么 后面每隔一个空格 的参数就依次是 $1, $2  ......。
  1. # 1.命令行参数  位置参数  parameters
  2. (basename $0), $1 ~ $9   ${10} (参数检测 -n -z )
  3. # 2.特殊参数变量
  4. $# : 命令行参数总和  最后一个参数 ${!#}         $* $@ 所有的参数
  5. # 3.移动变量
  6. shift n
  7. ## 4.处理选项options -a  getopt/getopts
  8. case  --双破折线  区分 parameter -- option   -a num1 -c num2
  9. # getopt / getopts 格式化命令行或参数  P300
  10. getopt ab:cd -a -b test1 -c -d test2 test3
  11. # 5. 选项标准化 默认的选项表示的意思  
  12. -c 计数 -r 递归 -q 安静
  13. ### 6.获得用户输入
  14. echo -n "Enter your name: " # 用户输入与提示文字 在一行,类似表单
  15. read name # read 将输入结果放进一个变量中
  16. echo "Hello $name, welcome to my program. "
  17. # 或者 一行搞定
  18. read -p "Please enter your age: " age
  19. # 超时 -t
  20. if read -t 5 -p "Please enter your name: " name
  21. then
  22.         echo "Hello $name, welcome to my script"
  23. else
  24.         echo
  25.         echo "Sorry, too slow! "
  26. fi
  27. # -s 隐藏读取 比如密码  实际上,数据会被显示,只是 read命令会将文本颜色设成跟背景色一样
  28. read -s -p "Enter your password: " pass
  29. ## 从文件读取 实用
  30. count=1
  31. cat test | while read line
  32. do
  33.         echo "Line $count: $line"
  34.         count=$[ $count + 1]
  35. done
  36. echo "Finished processing the file"
复制代码
四.重定向深入理解
  1. ### 1.输入与输出
  2. #文件描述符 非负整数 0标准输入 1标准输出 2标准错误
  3. <  >  2>  1>  &>
  4. ### 2.脚本重定向
  5. ## 临时重定向
  6. cat test8
  7. #!/bin/bash
  8. # testing STDERR messages
  9. echo "This is an error" >&2
  10. echo "This is normal output"
  11. $
  12. $./test8 2>test9 # 错误的信息被重定向
  13. ## 永久重定向
  14. $ cat test10
  15. #!/bin/bash
  16. # redirecting all output to a file
  17. exec 1>testout # or exec 2>testerror
  18. echo "This is a test of redirecting all output"
  19. echo "from a script to another file."
  20. echo "without having to redirect every individual line"
  21. ### 3.重定向输入
  22. exec 0< testfile
  23. while read line
复制代码
BTW:
阅读完上面的内容,基本上就能看懂上期我发的 简单可靠的SpringBoot Jar包启动脚本了。

来源:https://www.cnblogs.com/it-bt/p/18442126
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具