Shell 是一个命令解释权,它为用户提供了一个向 Linux 内核发送请求以便运行程序界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。
shell1.jpg

Shell编程快速入门

进入 Linux 终端,编写一个 Shell 脚本 hello.sh :

  1. #!/bin/bash
  2. echo 'hello world!'

运行:

  1. # 方法1
  2. sh hello.sh
  3. # 方法2
  4. chmod +x hello.sh
  5. ./hello.sh

终端打印出hello world!

说明:

  • #! 告诉系统这个脚本需要什么解释器来执行。
  • 文件扩展名 .sh 不是强制要求的。
  • 方法1 直接运行解释器,hello.sh 作为 Shell 解释器的参数。此时 Shell 脚本就不需要指定解释器信息,第一行可以去掉。
  • 方法2 hello.sh 作为可执行程序运行,Shell 脚本第一行一定要指定解释器

Shell变量

Shell 变量分为系统变量自定义变量。系统变量有$HOME、$PWD、$USER等,显示当前 Shell 中所有变量:set 。变量名可以由字母、数字、下划线组成,不能以数字开头。

  • 定义变量:变量名=变量值,等号两侧不能有空格,变量名一般习惯用大写。
  • 删除变量:unset 变量名 。
  • 声明静态变量:readonly 变量名,静态变量不能unset。
  • 使用变量:$变量名

将命令返回值赋给变量(重点)

  • A=ls 反引号,执行里面的命令
  • A=$(ls) 等价于反引号

Shell环境变量

shell2.jpg

  • export 变量名=变量值,将 Shell 变量输出为环境变量。
  • source 配置文件路径,让修改后的配置信息立即生效。
  • echo $变量名,检查环境变量是否生效

位置参数变量

  • $n :$0 代表命令本身、$1-$9 代表第1到9个参数,10以上参数用花括号,如 ${10}。
  • $* :命令行中所有参数,且把所有参数看成一个整体。
  • $@ :命令行中所有参数,且把每个参数区分对待。
  • $# :所有参数个数。

编写 Shell 脚本 positionPara.sh ,输出命令行输入的各个参数信息。

  1. #!/bin/bash
  2. # 输出各个参数
  3. echo $0 $1 $2
  4. echo $*
  5. echo $@
  6. echo 参数个数=$#

运行:

  1. chmod +x positionPara.sh
  2. ./positionPara.sh 10 20
  3. # 运行结果
  4. ./positionPara.sh 10 20
  5. 10 20
  6. 10 20
  7. 参数个数=2

预定义变量

在赋值定义之前,事先在 Shell 脚本中直接引用的变量。

  • $$ :当前进程的 PID 进程号。
  • $! :后台运行的最后一个进程的 PID 进程号。
  • $? :最后一次执行的命令的返回状态,0为执行正确,非0执行失败。

编写 Shell 脚本 prePara.sh ,输出命令行输入的各个参数信息。

  1. #!/bin/bash
  2. echo 当前的进程号=$$
  3. # &:以后台的方式运行程序
  4. ./hello.sh
  5. & echo 最后一个进程的进程号=$!
  6. echo 最后执行的命令结果=$?

运行结果:

  1. 当前的进程号=41752
  2. 最后一个进程的进程号=41753
  3. 最后执行的命令结果=0 # hello world!

运算符

  • $((运算式)) 或 $[运算式]
  • expr m + n 注意 expr 运算符间要有空格
  • expr m - n
  • expr *,/,% 分别代表乘,除,取余 ```bash

    第1种方式 $(())

    echo $(((2+3)*4))

第2种方式 $[],推荐

echo $[(2+3)*4]

使用 expr

TEMP=expr 2 + 3 echo expr $TEMP \* 4

  1. 条件判断:[ condition ] 注意condition前后要有空格。非空返回00 true,否则为 false
  2. ```bash
  3. #!/bin/bash
  4. if [ 'test01' = 'test' ]
  5. then
  6. echo '等于'
  7. fi
  8. # 20是否大于10
  9. if [ 20 -gt 10]
  10. then
  11. echo '大于'
  12. fi
  13. # 是否存在文件/root/shell/a.txt
  14. if [ -e /root/shell/a.txt ]
  15. then
  16. echo '存在'
  17. fi
  18. if [ 'test02' = 'test02' ] && echo 'hello' || echo 'world'
  19. then
  20. echo '条件满足,执行后面的语句'
  21. fi

流程控制

if分支

  1. if [ 条件判断式 ];then
  2. 程序
  3. fi
  4. # 或者(推荐)
  5. if [ 条件判断式 ]
  6. then
  7. 程序
  8. elif [ 条件判断式 ]
  9. then
  10. 程序
  11. fi
  1. #!/bin/bash
  2. if [ $1 -ge 60 ]
  3. then
  4. echo 及格
  5. elif [ $1 -lt 60 ]
  6. then
  7. echo "不及格"
  8. fi

case分支

  1. case $变量名 in
  2. "值1")
  3. 如果变量值等于值1,则执行此处程序1
  4. ;;
  5. "值2")
  6. 如果变量值等于值2,则执行此处程序2
  7. ;;
  8. ...省略其它分支...
  9. *)
  10. 如果变量值不等于以上列出的值,则执行此处程序
  11. ;;
  12. esac
  1. case $1 in
  2. "1")
  3. echo 周一
  4. ;;
  5. "2")
  6. echo 周二
  7. ;;
  8. *)
  9. echo 其它
  10. ;;
  11. esac

for循环

  1. # 语法1
  2. for 变量名 in 1 2 3...
  3. do
  4. 程序
  5. done
  6. # 语法2
  7. for ((初始值;循环控制条件;变量变化))
  8. do
  9. 程序
  10. done
  1. #!/bin/bash
  2. # 使用$*
  3. for i in "$*"
  4. do
  5. echo "the arg is $i"
  6. done
  7. echo "=================="
  8. # 使用$@
  9. for j in "$@"
  10. do
  11. echo "the arg is $j"
  12. done
  13. # 运行结果
  14. the arg is 1 2 3
  15. ==================
  16. the arg is 1
  17. the arg is 2
  18. the arg is 3
  19. # 输出从1加到100的值
  20. #!/bin/bash
  21. SUM=0
  22. for ((i=1;i<=100;i++))
  23. do
  24. SUM=$[$SUM+$i]
  25. done
  26. echo $SUM

while循环

  1. while [ 条件判断式 ]
  2. do
  3. 程序
  4. done
  1. #!/bin/bash
  2. SUM=0
  3. i=0
  4. while [ $i -le $1 ]
  5. do
  6. SUM=$[$SUM+$i]
  7. i=$[$i+1]
  8. done
  9. echo $SUM

执行逻辑

符号 说明
; 执行完成后程序继续
& 后台执行,程序继续
wait 所有后台执行完成后程序继续

输入/输出重定向

文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR),下面表里的n替换成对应数字即将文件描述符对应的内容重定向到对应文件。

命令 说明
command > file 将输出重定向到 file
command < file 将输入重定向到 file
command >> file 将输出以追加的方式重定向到 file
n > file 将文件描述符为 n 的文件重定向到 file
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file
n >& m 将输出文件 m 和 n 合并
n <& m 将输入文件 m 和 n 合并
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入

Source

https://zhuanlan.zhihu.com/p/102176365?utm_source=wechat_session&utm_medium=social&utm_oi=566268956583706624
https://www.runoob.com/linux/linux-shell.html