Shell脚本的执行方式
脚本格式要求
- 脚本以#!/bin/bash开头
- 脚本需要有可执行权限
Shell脚本中的注释方式:
单行注释使用#
多行注释如下
:<<!
注释内容
!
脚本的常用执行方式
- 方式1(推荐使用)
(1)、赋予helloworld.sh脚本x权限
(2)、输入脚本的绝对路径或相对路径 执行脚本 - 方式2:sh+脚本
不用赋予脚本x权限,直接执行即可
Shell的变量
Shell变量简介:
- Linux Shell中的变量分为:系统变量和用户自定义变量
- 系统变量:HOME、USER等
- 显示当前Shell中的所有变量:set
Shell变量的定义
- 定义变量:变量名=值
- 撤销变量:unset 变量名
- 声明静态变量:readonly 变量名=值,注意:不能unset
- export 可以把变量从一个sh脚本中导出为全局环境变量,供其他shell程序使用
Shell变量命名规则
- 还是熟悉的配方,字母数字下划线,不能数字开头
- 注意!等号两侧不能有空格
- 变量名一般习惯大写
将命令的返回值赋值给变量
- A=
ls -la
,将反引号内命令的结果返回给A - A= ( l s − l a ) , (ls -la), (ls−la),()的作用相当于反引号
设置环境变量
环境变量其实就是上一小节的变量,只不过是全局变量
使用方法:
- 在文件中定义(一般环境变量都在/etc/profile文件中):变量名=变量值
- export 变量名
- source 配置文件,刷新资源文件,使配置生效,也可以reboot或logout生效
- echo $变量名,在终端或其他sh脚本中可以打印环境变量值
位置参数变量
位置参数变量类似于java main函数中的args,通过命令行传入参数。
例如: ./shell.sh 100 200,这是一个执行shell的命令,在shell脚本中就可以获取到位置参数100、200的信息。
使用方法:
- $n:n为数字,$0代表命令本身,$n代表第n个参数,10以上的参数需要用花括号${10}
- $*:表示命令行中的所有参数,把所有的参数看成一个整体,相当于只有一个元素
- $@:表示命令行中的所有参数,但把每个参数区分对待,相当于所有参数构成了一个列表,参数是列表中的元素
- $#:表示命令行中所有参数的个数
预定义变量
shell设计者实现定义好的变量,可以直接在shell脚本中使用。
使用方法:
- $$:当前进程的PID
- $!:后台运行的最后一个进程的PID
- $?:最后一次执行的命令的返回状态,0表示上一个命令正确执行,非零表示不正确执行。
运算符
使用方法:
- $((运算式))或$[运算式]
- expr +,-,\*,/,%
示例:
- 计算(2 + 3) * 4
RES1=$(((2+3)*4))
echo $RES1
echo $[(2+3)*4]
TEMP=`expr 2 + 3`
RES3=`expr $TEMP \* 4`
echo $RES3
- 求出命令行的两个参数的和
vim shell.sh 100 200
echo $[$1+$2]
注意!!!
使用第一种方式时运算符和两边的数字之间不能有空格,第二种方式即expr,运算符和两边的数字必须有空格。
条件判断
条件(condition)用法:
[ condition ] 注意condition前后有空格
示例:
- 判断字符串"ok"是否等于"ok"
if [ "ok" = "ok" ]
then
echo "equal"
fi
- 判断23是否大于等于22
if [ 23 -ge 22]
then
echo "大于等于"
fi
- 判断文件是否存在
if [ -e /root/shell/aaa.txt ]
then
echo "exist"
fi
流程控制
1.流程控制之if
用法1:
if [ 条件判断式 ]
then
程序
fi
用法2:
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
fi
2.流程控制之case
用法:
case $变量名 in
val1)
程序段1
;;
val2)
程序段2
;;
*)
程序段3
;;
esac
示例:
case $变量名 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
3.流程控制之for
用法1:
for 变量 in val1 val2 val3 ...
do
程序段
done
用法2:
for((初始值;循环控制条件;变量变化))
do
程序
done
示例:
- 打印命令行输入的参数,此处可以看出 @ 和 @和 @和*的区别
for i in "$*"
do
echo $i
done
for j in "$@"
do
echo $j
done
- 从1累加到100
SUM=0
for((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo $SUM
4.流程控制之while
用法:
while [ 条件判断式 ]
do
程序
done
- 从命令行输入一个数n,统计1到n的累加值
SUM=0
i=0
while [ $i -le $1]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo $SUM
read读取控制台输入
使用方法:
read [选项] 参数
常用选项:
-p:指定读取值时的提示符
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待。
参数即指定读取值的变量名
示例:
- 读取控制台输入一个num值
read -p “请输入一个数num1=” NUM1
echo “输入的值是num1=$NUM1” - 读取控制台输入一个num值,在10秒内输入
read -t 10 -p “请输入一个数num2=” NUM2
echo “输入的值是num2=$NUM2”
函数
shell编程与其他语言相同,有系统函数,也可以自定义函数。
两个简单的系统函数:
-
basename:返回完整路径最后/的部分,常用于获取文件名
basename [pathname] [suffix]
basename [string] [suffix]
如果添加了suffix选项,则返回值中会删掉suffix -
dirname:返回完整路径最后/的前面部分,常用于返回路径部分
示例:
-
返回/home/aaa/test.txt的“test.txt”部分
basename /home/aaa/test.txt 返回test.txt
basename /home/aaa/test.txt .txt 返回test -
返回/home/aaa/test.txt的/home/aaa部分
dirname /home/aaa/test.txt
自定义函数
[function] funcname[()]
{
Action;
[return int;]
}
调用时直接用函数名:funcname
示例:
- 计算输入两个参数的和
function getSum(){
SUM=$[$n1+$n2]
echo "和是$SUM"
}
read -p "输入n1" n1
read -p "输入n2" n2
# 调用
getSum $n1 $n2