Shell 是一个命令解释权,它为用户提供了一个向 Linux 内核发送请求以便运行程序界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。
Shell编程快速入门
进入 Linux 终端,编写一个 Shell 脚本 hello.sh :
#!/bin/bashecho 'hello world!'
运行:
# 方法1sh hello.sh# 方法2chmod +x hello.sh./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环境变量

- export 变量名=变量值,将 Shell 变量输出为环境变量。
- source 配置文件路径,让修改后的配置信息立即生效。
- echo $变量名,检查环境变量是否生效
位置参数变量
- $n :$0 代表命令本身、$1-$9 代表第1到9个参数,10以上参数用花括号,如 ${10}。
- $* :命令行中所有参数,且把所有参数看成一个整体。
- $@ :命令行中所有参数,且把每个参数区分对待。
- $# :所有参数个数。
编写 Shell 脚本 positionPara.sh ,输出命令行输入的各个参数信息。
#!/bin/bash# 输出各个参数echo $0 $1 $2echo $*echo $@echo 参数个数=$#
运行:
chmod +x positionPara.sh./positionPara.sh 10 20# 运行结果./positionPara.sh 10 2010 2010 20参数个数=2
预定义变量
在赋值定义之前,事先在 Shell 脚本中直接引用的变量。
- $$ :当前进程的 PID 进程号。
- $! :后台运行的最后一个进程的 PID 进程号。
- $? :最后一次执行的命令的返回状态,0为执行正确,非0执行失败。
编写 Shell 脚本 prePara.sh ,输出命令行输入的各个参数信息。
#!/bin/bashecho 当前的进程号=$$# &:以后台的方式运行程序./hello.sh& echo 最后一个进程的进程号=$!echo 最后执行的命令结果=$?
运行结果:
当前的进程号=41752最后一个进程的进程号=41753最后执行的命令结果=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
条件判断:[ condition ] 注意condition前后要有空格。非空返回0,0为 true,否则为 false 。```bash#!/bin/bashif [ 'test01' = 'test' ]thenecho '等于'fi# 20是否大于10if [ 20 -gt 10]thenecho '大于'fi# 是否存在文件/root/shell/a.txtif [ -e /root/shell/a.txt ]thenecho '存在'fiif [ 'test02' = 'test02' ] && echo 'hello' || echo 'world'thenecho '条件满足,执行后面的语句'fi
流程控制
if分支
if [ 条件判断式 ];then程序fi# 或者(推荐)if [ 条件判断式 ]then程序elif [ 条件判断式 ]then程序fi
#!/bin/bashif [ $1 -ge 60 ]thenecho 及格elif [ $1 -lt 60 ]thenecho "不及格"fi
case分支
case $变量名 in"值1")如果变量值等于值1,则执行此处程序1;;"值2")如果变量值等于值2,则执行此处程序2;;...省略其它分支...*)如果变量值不等于以上列出的值,则执行此处程序;;esac
case $1 in"1")echo 周一;;"2")echo 周二;;*)echo 其它;;esac
for循环
# 语法1for 变量名 in 值1 值2 值3...do程序done# 语法2for ((初始值;循环控制条件;变量变化))do程序done
#!/bin/bash# 使用$*for i in "$*"doecho "the arg is $i"doneecho "=================="# 使用$@for j in "$@"doecho "the arg is $j"done# 运行结果the arg is 1 2 3==================the arg is 1the arg is 2the arg is 3# 输出从1加到100的值#!/bin/bashSUM=0for ((i=1;i<=100;i++))doSUM=$[$SUM+$i]doneecho $SUM
while循环
while [ 条件判断式 ]do程序done
#!/bin/bashSUM=0i=0while [ $i -le $1 ]doSUM=$[$SUM+$i]i=$[$i+1]doneecho $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
