shell是一个命令行解释器,他为用户提供一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动,挂起,停止甚至编写一些程序。
#!/bin/bash
开头vim hello.sh
#!/bin/bash
echo "hello,shell"
hello.sh
赋予执行权限./hello.sh
,或者使用绝对路径执行脚本./home/shcode/hello.sh
,或者使用sh hello.sh
也可以使用绝对路径。linux shell中的变量可以分为系统变量和用户自定义变量
系统变量:$HOME, $PWD, $SHELL, $USER等等,比如 echo $SHELL
显示当前shell中的所有变量:set
静态变量无法unset
#!/bin/bash
# 定义变量A
A=100
#输出变量需要使用$
echo A=$A
echo "A=$A"
# 撤销变量A
unset A
echo "A=$A"
# 声明静态变量B=2,不能unset
readonly B=2
echo "B=$B"
#unset B
# 将指令的结果赋给变量,使用``或者$()
C=`date`
D=$(date)
echo "C=$C"
echo "D=$D"
# 使用环境变量 SHELL
echo "shell=$SHELL"
vim中多行注解
:<<!
xxx
...
!
在/etc/profile文件中定义TOMCAT_HOME环境变量
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。例如./myshell.sh 100 200
这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数消息(100和200)。
#!/bin/bash
echo "0=$0, 1=$1,2=$2"
echo "所有的参数=$*"
echo "$@"
echo "参数个数=$#"
就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用。
#!/bin/bash
echo "当前进程的进程号id=$$"
# 以后台的方式运行一个脚本,并获取他的进程号
/home/shcode/hello.sh &
echo "最后一个后台方式运行的进程id=$!"
echo "执行的结果是=$?"
#!/bin/bash
# 案例1:计算(2+3)* 4
# 使用第一种方式
RES1=$(((2 + 3)*4))
echo "res1=$RES1"
# 使用方式2,推荐使用
RES2=$[(2+3)*4]
echo "res2=$RES2"
# 使用方式3 expr
TEMP=`expr 2 + 3 `
RES4=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res4=$RES4"
# 案例2:求命令行的两个参数的和 20 50
SUM=$[$1+$2]
echo "sum=$SUM"
[ condition ]
注意condition前后要有空格,非空返回true, 可以使用$?验证(0为true,>1 为fasle)
判断语句:
#!/bin/bash
# 案例1:字符串是否相等
if [ "ok" = "ok" ]
then
echo "equal"
fi
# 案例2:23是否大于等于22
if [ 23 -gt 22 ]
then
echo "大于"
fi
# 案例3:/home/shcode/oper.sh 文件是否存在
if [ -f /home/shcode/oper.sh ]
then
echo "存在"
fi
#案例4:条件不为空
if [ root ]
then
echo "root"
fi
if [ condition ]
then
语句块
fi
# 或,多分支
if [ condition ]
then
语句块
elif [ condition ]
then
语句块
fi
#!/bin/bash
# 如果输入的参数大于等于60输出“及格了”否则输出“不及格”
if [ $1 -ge 60 ]
then
echo "及格了"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
case $变量名 in
"值1")
语句块
;;
"值2")
语句块
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
#!/bin/bash
# 当命令行参数为1,输出周一,是2输出周二,其他情况输出other
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
for (( 初始值; 循环控制条件; 变量变化))
do
代码
done
#!/bin/bash
# 打印命令行输入的参数
# $*是把输入的参数,当做一个整体,所以只会输出一句
for i in "$*"
do
echo "num is $i"
done
# $@获取输入的参数,是分开处理的
for j in "$@"
do
echo "num is $j"
done
#!/bin/bash
SUM=0
for(( i=1; i<=$1; i++))
do
SUM=$[$SUM+$i]
done
echo "SUM=$SUM"
while [ condition ]
do
代码块
done
#!/bin/bash
# 求1到n的值
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "SUM=$SUM"
read (选项)(参数)
选项:
参数:
#!/bin/bash
# 案例1:读取控制台输入的num1
read -p "请输入一个数NUM1=" NUM1
echo "你输入的NUM1="$NUM1
# 案例2:读取控制台输入的NUM2值,在10s内输入
read -t 10 -p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2="$NUM2
shell中既有系统函数也有自定义函数
basename [pathname] [suffix]
功能:返回完整路径最后/的部分,常用于获取文件名
dirname 文件绝对路径
function functionName() {
Action;
[return int;]
}
#!/bin/bash
# 案例1:计算输入两个参数的和
function getSum() {
SUM=$[$n1+$n2]
echo "和是=$SUM"
}
# 输入两个值
read -p "请输入一个数n1=" n1
read -p "请输入一个数n2=" n2
# 调用自定义函数
getSum $n1 $n2