shell是一个命令行解释器,它为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。
(1)脚本以 # !/bin/bash
(#和!之间有空格)开头
例:vim a.sh
# !/bin/bash/
echo "hello word!"
使用 ls -l
-rw-r--r-- 1 wjy wjy 35 8月 27 10:16 a.sh
保存退出后,此时a.sh还没有权限去直接运行,需要chmod 774 a.sh
才可以使用./a.sh
来运行。
注:
-rw-r–r--,表示这是一个普通文件,创建文件的用户的权限为rw-,创建文件的用户所在的组的权 限为r–,其他用户的权限为r–。
在修改权限时,是用不同数字来表示不同权限的。4表示读取权限,2表示写入权限,1表示执行权限。
设置权限时,要给3类用户分别设置权限。
例如chmod 761表示,给创建文件的用户设置的权限是7,7=4+2+1,所以意思是给创建文件的用户赋予读取,写入和执行权限。6=4+2,也就是说给创建文件的用户所在的组赋予读取和写入权限,最后一个1表示执行权限,也就是说,给其他用户执行权限。
或者直接使用 sh ./a.sh
也可以运行
1)Linux Shell 中的变量分为,系统变量和用户自定义变量。
2) 系统变量:$HOME、 $ PWD 、$SHELL、 $USER 等等
比如: echo $HOME 等等…
3) 显示当前Shell中所有变量:set
4)用户自定义变量
定义变量的规则:
变量名称可以由字母、数字和下划线组成,但不能以数字开头;等号两侧不能有空格;变量名称一般习惯为大写。
基本语法:变量 = 值
撤销变量:unset 变量
声明静态变量:readonly变量,注意:不能unset
例:
# !/bin/bash/
#echo "hello world!"
A=1000
echo "A=$A"
unset A
echo "A=$A"
~
输出:A=1000 A=
将命令的返回值赋给变量:
A=‘ls -la’ (反引号) 运行里面的命令,并把结果返回给变量A
A=$(ls -la) 等价于反引号
例:
# !/bin/bash/
RESULT=`ls -l /home`
echo $RESULT
echo ""
MY_DATE=$(data)
echo "date=$MY_DATE"
4)设置环境变量
基本语法
1.export 变量名=变量值 (功能描述,将shell变量输出为环境变量)
TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME
2.source /etc/profile (功能描述:让修改后的配置信息立即生效)
source /etc/profile
3.echo $变量名 (功能描述:查询环境变量的值)
echo $TOMCAT_HOME
就会输出 /opt/tomcat
补充:shell脚本里面多行注释
:<<!
echo "xxxx"
echo "fsfsf"
echo "hgjuyg"
!
5)位置参数变量
介绍:
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如:./myshell.sh 100 200,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息。
基本语法:
$n : (功能描述:n为数字, 0 代 表 本 身 , 0代表本身, 0代表本身,"$1 - $ 9"代表第一到第九个参数,十以上的参数需要用大括号包含,如${10} )。
$* : (功能描述:这个变量代表命令行中所有的参数,“ $* ” 把所有的参数看成一个整体)
$@ :(功能描述:这个变量也代表命令行中所有的参数,不过" $@ "把每个参数区分对待)
$# : (功能描述:这个变量代表命令行中所有参数的个数)
例:
vim positionPara.sh
# !/bin/bash
#获取到各个参数
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数=$#"
chmod 744 positionPara.sh
./positionPara.sh 30 60
输出:
./positionPara.sh 30 60
30 60
30 60
参数个数=2
6)预定义变量
基本介绍:
就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
基本语法
$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:后台运行的最后一个进程号(PID))
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行,如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
例:
vim preVar.sh
# !/bin/bash
echo "当前的进程号=$$"
#后台的方式运行 a.sh
./a.sh
echo "最后的进程号=$!"
echo "执行的值=$?"
~
chmod 744 preVar.sh
./preVar.sh
输出:
当前的进程号=17848
最后的进程号=17849
执行的值=0
wjy@wjy-Y7000:~/wjy/shell_test$ A=1000
A=
7)运算符
基本语法:
# !/bin/bash
#第一中方式$()
RESULT1=$(((2+3)*4))
echo "result1=$RESULT1"
#第二种方式$[]
RESULT2=$[(2+3)*4]
echo "result2=$RESULT2"
#使用exper
TEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
echo "result3=$RESULT3"
#求两个参数的和
SUM=$[$1+$2]
echo "SUM=$SUM"
输出:
wjy@wjy-Y7000:~/wjy/shell_test$ ./demo.sh 10 18
result1=20
result2=20
result3=20
SUM=28
8)条件判断
[ condition ] (注意condition前后要有空格)
#非空返回true,可以使用$?验证(0为true,>1为false)
1.两个整数的比较
= 字符串比较
-lt 小 于
-le 小于等于
-eq 等 于
-gt 大 于
-ge 大于等于
-ne 不等于
2.按照文件权限进行判断
-r 有读的权限 [ -r 文件]
-w 有写的权限
-x 有执行的权限
3.按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
例:
vim judge.sh
# !/bin/bash
#案例1,“OK”是否等于“OK”
if [ "ok" = "ok" ]
then
echo "equal"
fi
#案例2:23是否大于等于22
if [ 23 -gt 22 ]
then
echo "大于"
fi
#案例3: /home/wjy/Downloads/SGG_Linux.docx 文件是否存在
if [ -e /home/wjy/Downloads/SGG_Linux.docx ]
then
echo "存在"
fi
~
输出
equal
大于
存在
9)流程控制
• 基本语法
if [条件判断式];then
程序
fi
或者
if [条件判断式]
then
程序
elif [条件判断式]
then
程序
fi
注意事项:(1)[条件判断式],中括号和条件判断式之间必须有空格(2)推荐使用第二种方式
例:
case语句:
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
例:
for循环:
基本语法1:
for 变量 in 值1 值2 值3…
do
程序
done
例:
while循环
• 基本语法1
while [条件判断式]
do
程序
done
例:
# !/bin/bash
#案例1,从命令行输入一个数n,统计从1+ ... +n的值是多少
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "sum=$SUM"
输出:
wjy@wjy-Y7000:~/wjy/shell_test$ ./test_while.sh 100
sum=5050
10)shell读取控制台输入
基本语法
read (选项) (参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。参数
变量:指定读取值的变量名