shell是核心程序kernel之外的指令解析器,是一个程序
shell是终端上的一个解释器,可以对linux命令进行解释并执行,实现与操作系统的交互。
shell和python一样,是解释型语言
目录
1.shall脚本编写规范
#定义一个变量 最好见名知意 最好全部大写 当然只是建议 你快乐就好
AGE=19 #等号两边不能加空格,脚本对于空格很敏感
echo "年龄是:$AGE" #脚本语言中取值变量值要加上$符号。
echo "年龄是:AGE" #不加$会原原本本输出。
NAME="xioaming"
echo "学生的名字是:$NAME" #不完全输出
echo '学生的名字是:$NAME' #完全输出
echo "请输入你的年龄:"
read age #阻塞等待终端输入的年龄然后去读取。脚本中的变量可以现定义现用。
echo "年龄是:$age"
#带提示的输入
read -p "请输入学校:" SCHOOL #提示语句和变量之间必须有个英文状态下的空格
2.系统预设变量
系统预设变量:Linux系统预先的定义好的一些变量
当运行脚本时,想给脚本传递参数
变量名:0 1 2 3 4 5 6 7 8 9 # *
变量值:$0 $1……$*
echo "预设变量0的值是:$0" #保存文件名
echo "预设变量1的值是:$1" #保存第一个参数名
echo "预设变量2的值是:$2" #保存第二个参数名
echo "预设变量3的值是:$3" #保存第三个参数名 类推
echo "预设变量4的值是:$4"
echo "预设变量5的值是:$5"
echo "预设变量6的值是:$6"
echo "预设变量7的值是:$7"
echo "预设变量8的值是:$8"
echo "预设变量9的值是:$9"
echo "预设变量#的值是:$#" #保存参数个数
echo "预设变量*的值是:$*" #保存所有参数名
基于这种特性我们可以编写出一些功能脚本
mkdir $1 #创建以第一个参数为名的目录
cd $1 #进入这个目录
touch $2 #创建以第二个参数为名的文件
这个demo脚本的作用就是再第一个参数为名的文件夹下创建第二个参数为名文件
bash demo hello world //文件名后面的就是参数这里传递了两个参数,第一个一个是hello,第二个是world
//这个脚本的作用就是在当前目录下创建第一个参数名的文件夹然后再这个文件夹里面创建第二个参数名的文件
3.算数运算符
1.expr命令
expr是一个运算命令
expr 3 + 4 // 加号左右两边要有空格,减法也是如此
expr 3 \* 4 //*需要加斜杠,转义以下,因为*是一个通配符。
expr 3 / 4 //除法不用
expr 3 % 4
2.保存命令执行结果
``--->取命令执行结果
$--->取变量的值
LIST=`ls` #取ls命令执行的结果赋值给LIST
echo "$LIST"
TIME=`date`
echo "$TIME"
NUM1=`expr 3 + 5`
NUM2=`expr $NUM1 \* 5`
echo "NUM1:$NUM1 NUM2:$NUM2"
3.分支语句
#单分支语句
if [ 条件 ] #[]两边要有空格
then
条件成立要执行的语句
fi
#if-else双分支语句
if [ 条件1 ] #[]两边要有空格
then
条件1成立要执行的语句1
elif [ 条件2 ]
then
条件1不成立条件2成立要执行的语句2
elif [ 条件3 ]
then
条件1条件2、不成立条件3成立要执行的语句3
……
else
上面条件都不成立成立要执行的语句
fi
例子:判断字符串是否相等
#在shell中判断两个字符串是否相等直接用=或==
read -p "请输入:" NAME
if [ $NAME == "susan" ]
then
echo "是susan"
elif [ $NAME = "ikun" ]
then
echo "是ikun"
else
echo "纯路人"
fi
4.case语句
case 分支结构---》多分枝且等值判断
case $NUM in
1): #----》case 1:
执行语句
;;
2): #----》case 2:
执行语句
;;
……
*): #---》default :
上面都不相等 默认执行这个分支
;;
esac
5.关系运算符
equals #等于
not #不等
little #小于
great #大于
#关系运算符可以用来与数字做比较
-eq #等于
-ne #不等于
-gt #大于
-lt #小于
-ge #大于等于
-le #小于等于
read -p "请输入两个整数:" NUM1 NUM2
if [ $NUM1 -gt $NUM2 ]
then
echo "yes"
else
echo "no"
fi
6.文件判断
-e #判断文件是否存在,不区分文件类型
-d #判断目录是否存在
-f #判断普通文件是否存在
-r #判断是否有读权限
-w #判断是否有写权限
-x #判断是由可执行
read -p "请输入文件名" NAME
if [ -e $NAME ]
then
echo"$NAME文件在当前路径存在"
else
echo "$NAME文件在当前路径不存在"
fi
7.循环
1.for循环
for 变量名 in 单词表
do
循环操作
done
#单词表有格式要求
LIST="小熊 小牛 小雨" #值与值之间要用空格分开
LIST="ikun susan ctrl music"
for NAME in $LSIT
do
echo "$NAME" #循环输出LIST内容
done
#容错判断
if [ $# -ne 2 ]
then
echo "err" #传参错误,少传或多传
exit
fi
LIST=`ls $1` #把第一个参数里面的内容传给LIST形成单词表。因为ls 命令产生的刚好是以空格分割的变量名列表
for NAME in LIST
do
cp -r $1/$NAME $2
#$NAME 不在当前路径下,而是传递而来的参数目录下。 -r 是为了确保目录也能传过去
done
#这一段代码实现的是把第一个参数里的内容传给第二个
2.while循环
while [ 循环条件 ]
do
循环操作
done
#实现求一加到一百的累加和
SUM=0
I=1
while [ $I -le 100 ]
do
SUM=`expr $I + $SUM`
I=`expr $I + 1`
done
echo "SUM is :$SUM"