Shell 是什么?
Shell 是一个命令解释权,它为用户提供了一个向 Linux 内核发送请求以便运行程序界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。
Shell 编程快速入门
进入 Linux 终端,编写一个 Shell 脚本 hello.sh :
#!/bin/bash echo 'hello world!'
运行:
// 方法1 # sh hello.sh // 方法2 # chmod +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 $变量名,检查环境变量是否生效
位置参数变量
基本语法
- 1 代表命令本身、9 代表第1到9个参数,10以上参数用花括号,如${10}。
- $* :命令行中所有参数,且把所有参数看成一个整体。
- $@ :命令行中所有参数,且把每个参数区分对待。
- $# :所有参数个数。
实例:
编写 Shell 脚本 positionPara.sh ,输出命令行输入的各个参数信息。
#!/bin/bash # 输出各个参数 echo $0 $1 $2 echo $* echo $@ echo 参数个数=$#
运行:
# chmod +x positionPara.sh # ./positionPara.sh 10 20
运行结果:
positionPara.sh 10 20 10 20 10 20 参数个数=2
预定义变量
定义
在赋值定义之前,事先在 Shell 脚本中直接引用的变量。
基本语法
- $$ :当前进程的 PID 进程号。
- $! :后台运行的最后一个进程的 PID 进程号。
- $? :最后一次执行的命令的返回状态,0为执行正确,非0执行失败。
实例:
编写 Shell 脚本 prePara.sh ,输出命令行输入的各个参数信息。
#!/bin/bash echo 当前的进程号=$$ # &:以后台的方式运行程序 ./hello.sh & echo 最后一个进程的进程号=$! echo 最后执行的命令结果=$?
运行结果:
当前的进程号=41752 最后一个进程的进程号=41753 最后执行的命令结果=0 # hello world!
运算符
基本语法
- [运算式]
- expr m + n 注意 expr 运算符间要有空格
- expr m – n
- expr \*,/,% 分别代表乘,除,取余
实例
# 第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 。
实例
#!/bin/bash if [ 'test01' = 'test' ] then echo '等于' fi # 20是否大于10 if [ 20 -gt 10] then echo '大于' fi # 是否存在文件/root/shell/a.txt if [ -e /root/shell/a.txt ] then echo '存在' fi if [ 'test02' = 'test02' ] && echo 'hello' || echo 'world' then echo '条件满足,执行后面的语句' fi
运行结果:
大于 hello 条件满足,执行后面的语句
流程控制
if 判断
基本语法
if [ 条件判断式 ];then 程序 fi # 或者(推荐) if [ 条件判断式 ] then 程序 elif [ 条件判断式 ] then 程序 fi
实例
编写 Shell 程序:如果输入的参数大于60,输出“及格”,否则输出“不及格”。
#!/bin/bash if [ $1 -ge 60 ] then echo 及格 elif [ $1 -lt 60 ] then echo "不及格" fi
case 分支
基本语法
case $变量名 in "值1") 如果变量值等于值1,则执行此处程序1 ;; "值2") 如果变量值等于值2,则执行此处程序2 ;; ...省略其它分支... *) 如果变量值不等于以上列出的值,则执行此处程序 ;; esac
实例
当命令行参数为1时输出“周一”,2时输出“周二”,其他情况输出“其它”。
case $1 in "1") echo 周一 ;; "2") echo 周二 ;; *) echo 其它 ;; esac
for 循环
基本语法
# 语法1 for 变量名 in 值1 值2 值3... do 程序 done # 语法2 for ((初始值;循环控制条件;变量变化)) do 程序 done
实例
- 打印命令行输入的参数。
#!/bin/bash # 使用$* for i in "$*" do echo "the arg is $i" done echo "==================" # 使用$@ for j in "$@" do echo "the arg is $j" done
运行结果(回顾一下
$*
和$@
的区别):the arg is 1 2 3 ================== the arg is 1 the arg is 2 the arg is 3
- 输出从1加到100的值。
#!/bin/bash SUM=0 for ((i=1;i<=100;i++)) do SUM=$[$SUM+$i] done echo $SUM
while 循环
基本语法
while [ 条件判断式 ] do 程序 done
实例
输出从1加到100的值。
#!/bin/bash SUM=0 i=0 while [ $i -le $1 ] do SUM=$[$SUM+$i] i=$[$i+1] done echo $SUM
读取控制台输入
基本语法
read(选项)(参数)
选项
- -p:指定读取值时的提示符
- -t:指定读取值时等待的时间(秒),如果没有在指定时间内输入,就不再等待了。
参数
- 变量名:读取值的变量名
实例
读取控制台输入一个num值。
#!/bin/bash read -p "请输入一个数num1=" NUM1 echo "你输入num1的值是:$NUM1" read -t 10 -p "请在10秒内输入一个数num2=" NUM2 echo "你输入num2的值是:$NUM2"
运行结果:
请输入一个数num1=10 你输入num1的值是:10 请在10秒内输入一个数num2=20 你输入num2的值是:20
函数
和其它编程语言一样,Shell 编程有系统函数和自定义函数,本文只举两个常用系统函数。
系统函数
- basename,删掉路径最后一个 / 前的所有部分(包括/),常用于获取文件名。
基本语法
- basename [pathname] [suffx]
- basename [string] [suffx]
- 如果指定 suffx,也会删掉pathname或string的后缀部分。
实例
# basename /usr/bin/sort sort # basename include/stdio.h stdio.h # basename include/stdio.h .h stdio
- dirname,删掉路径最后一个 / 后的所有部分(包括/),常用于获取文件路径。
基本语法
- dirname pathname
- 如果路径中不含 / ,则返回 ‘.’ (当前路径)。
实例
# dirname /usr/bin/ /usr # dirname dir1/str dir2/str dir1 dir2 # dirname stdio.h .
自定义函数
基本语法
[ function ] funname[()] { Action; [return int;] } # 调用 funname 参数1 参数2...
实例
计算输入两个参数的和。
#!/bin/bash function getSum(){ SUM=$[$n1+$n2] echo "sum=$SUM" } read -p "请输入第一个参数n1:" n1 read -p "请输入第二个参数n2:" n2 # 调用 getSum 函数 getSum $n1 $n2