Shell编程
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。Shell是解释执行的脚本语言,在Shell中可以调用Linux系统命令。
1、Shell脚本的执行方式
echo “hello world” 输出内容到控制台
echo -e “hello world \n hello java” 输出内容到控制台,支持\反斜杠转义字符
./helloworld.sh ./的方式执行脚本
sh helloworld.sh sh方式执行脚本
第一个shell脚本:
#!/bin/bash
echo -e "hello world\nhello java"
#!/bin/bash是指此脚本使用/bin/bash来解释执行。
其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。
bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,…
常用转义字符:
控制字符 | 作用 |
---|---|
centered 文本居中 | right-aligned 文本居右 |
\\ | 输出\本身 |
\a | 输出警告音 |
\b | 退格键,也就是向左删除键 |
\c | 取消输出行末的换行符。和“-n”选项一致 |
\e | ESCAPE键 |
\f | 换页符 |
\n | 换行符 |
\r | 回车键 |
\t | 制表符,也就是Tab键 |
\v | 垂直制表符 |
\0nnn | 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数 |
\xhh | 按照十六进制ASCII码表输出字符。其中hh是两位十六进制数 |
2、Shell中的变量
2.1、变量定义
Linux Shell中的变量分为,系统变量和用户自定义变量:
系统变量:$HOME、$PWD、$SHELL、$USER等等
自定义变量:
使用A=8设置一个变量A,并初始化
使用unset撤销变量
使用readonly设置静态变量
使用export设置为全局变量
$符表示取出变量的值
变量命名规则:
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
- 等号两侧不能有空格
- 变量名称一般习惯为大写
测试脚本:
#!/bin/bash
echo -e "hello world\nhello java"
A=8
echo "set A": $A
unset A
echo "unset A": $A
readonly B=2
echo "readonly B":$B
export B
echo $B
2.2、将linux命令的返回值赋予变量
A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
A=$(ls -la) 等价于反引号
测试脚本:
#!/bin/bash
A=$(ls -al)
echo $A
B=`ls -al`
echo $B
2.3、设置环境变量
环境变量在/etc/profile文件中定义:
export JAVA_HOME=/opt/module/jdk1.8.0_144
export PATH=$PATH:$JAVA_HOME/bin
查看环境变量:
echo $JAVA_HOME
让修改后的配置信息立即生效:
source /etc/profile
2.4、位置参数变量
$n n为数字,$0代表脚本名,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10})
$* 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$# 这个变量代表命令行中所有参数的个数
测试脚本:
#!/bin/bash
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "$#"
测试$* $@的区别脚本:
#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
echo "The parameters is: $i"
done
x=1
for y in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "The parameter$x is: $y"
x=$(( $x +1 ))
done
2.5、预定义变量
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)
$? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;
如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
测试脚本:
#!/bin/bash
echo "$$"
./helloworld.sh & #&号表示后台进程执行这个脚本
echo "$!"
echo "$?"
3、运算符
$((运算式))
$[运算式]
expr m + n 注意expr运算符间要有空格
expr m - n 注意expr运算符间要有空格
expr *, /, % 乘,除,取余
测试脚本:
#!/bin/bash
echo $((3*4+2))
echo $[3*4+2]
S=`expr 2 + 3`
echo $S
4、条件判断
[ condition ](注意condition前后要有空格)
两个整数之间比较:
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
按照文件权限进行判断:
-r 有读的权限
-w 有写的权限
-x 有执行的权限
按照文件类型进行判断:
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
测试脚本:
[ 23 -ge 22 ]
[ -w student.txt ]
[ -e /root/install.log ]
5、流程控制
5.1、if逻辑判断一个例子就解释完全:(注意条件判断[]括号两边的空格)
#!/bin/bash
if [ $1 -eq "123" ]
then
echo "123"
elif [ $1 -eq "456" ]
then
echo "456"
else
echo "=============="
fi
5.2、case逻辑判断:
#!/bin/bash
case $1 in
"1")
echo "1"
;;
"2")
echo "2"
;;
*)
echo "other"
;;
esac
5.4、for循环的两种方式:
for 变量 in 值1 值2 值3…
do
程序
done
#!/bin/bash
#打印数字
for i in "$*"
do
echo "The num is $i "
done
//这里的i、j是键,不是值
for j in "$@"
do
echo "The num is $j"
done
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
#!/bin/bash
s=0
for((i=0;i<=100;i++))
do
s=$[$s+$i]
done
echo "$s"
5.5、while循环
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
6、读取控制台输入
读取控制台输入的值,赋予NAME这个变量:
#!/bin/bash
# -p:指定读取值时的提示符;
# -t:指定读取值时等待的时间(秒)
# NAME:读取值的变量名
read -t 7 -p "please 7 miao input your name " NAME
echo $NAME
7、函数
#!/bin/bash
function sum()
{
s=0
s=$[ $1 + $2 ]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;