目录
一、【shell的概述】
1、什么是shell
shell既是软件又是语言。是用户和linux内核的接口程序
软件:shell命令解析器 bash sh ash 等 将脚本文件逐行解析执行
语言:必须符合解析器的规则
2、系统自动调用的两个脚本文件
1)/etc/profile :对系统所有用户有效果 登陆时候
2) ~/.bashrc:对登陆的用户有效 打开终端或者登陆都会执行
二、创建并执行shell
1、创建shell
myfirst.sh:
#!/bin/bash 指定解释器
echo "hahha" 编写shell
####如果执行权限,使用chmod +x myfirst.sh增加可执行权限
2、执行shell的三种方式
1) ./myfirst.sh //检测第一行指定解释器
2) bash myfirst.sh // 指定使用bash ,会忽略第一行
这两种会启用新的shell去执行脚本
3) . myfirst.sh //使用当前shell,不会启用新的shell
注:如果有格式错误:
1、使用 dow2unix 脚本文件
2、使用vi打开文件,在最后一行模式下执行
:set ff=unix
三、shell的自定义变量
1、写操作
#!/bin/bash
#定义变量
num=10 #"="两边不能有空格
#对变量读操作
echo $num
#对变量写操作
num=100
echo $num
#清除一个变量
unset num
echo "------"
echo $num #打印空白
2、读操作
#!/bin/bash
num=0
#从键盘获取变量
echo "请输入num的值"
read num
#如果想输入的num值是在上面语句紧接这后面
#使用:read -p "请输入num的值:" num
echo "num = $num"
只读变量
readonly data=10 #只读变量
echo "data=$data"
data=20
3、将脚本的变量导出变成环境变量
#!/bin/bash
export data=2000
echo "data=$data"
4、" " 和 ' ' 区别
" " :”可以解析变量
' ' :不可以解析变量
5、shell的预设变量
#!/bin/bash
echo "参数的个数:$#"
echo "参数的内容:$*"
echo "第一个参数是:$1"
echo "第二个参数是:$2"
echo "$?"
$#参数的个数
$*参数的内容
$1 $2 $3......就是第几个参数
$? 返回0 就是上一条语句执行成功,返回1就是失败
6、shell的特殊用法
1)``(!左边的符号),作为系统命令
echo "today is `date`
2)转义符,date -e 才生效
echo -e "####\n####"
3) () 和{ } 的区别
():
num=10
(
num=100
echo "()中的num=$num"
)
echo "()外的num=$num"
{ }:
num=10
{
num=100
echo "()中的num=$num"
}
echo "()外的num=$num"
7、条件测试语句
1)文件测试语句
#!/bin/bash
test -e 1.txt
echo "$?"
#两种语法
[ -e 1.txt ]
echo "$?
2)字符串测试语句
1、测试两个字符串是否相等
str2="haha"
str3="hehe"
test "$str2" == "$str3"
echo "$?" #不相等返回1,相等返回0
test "$str2" != "str3"
echo "$?" #不相等返回0,相等返回1
2、测试字符串是否为空
str=""
test -z "$str"
echo "$?" #0 表示为空
str1="hello world"
test -z "$str1"
echo "$?" #1表示非空
3、返回字符串长度
str4="hahahahahhhah"
echo "${#str4}" #返回13
4、替换、提取字符串
echo "${str4:3:6}" #从第三个字符开始提取6个字节
echo "${str4/a/e}" #用e替换第一个a
echo "${str4//a/e}" #用e替换所有a
3)数字测试语句
1)判断大小等于
read -p "请输入两个数" num1 num2
test $num1 -eq $num2
echo "$?" #相等返回0,不相等返回1
[ $num1 -gt $num2 ]
echo "$?" #大于返回0,否则返回1
2)echo ${num:-val} :如果num存在则表达式为num,如果不存在就等于val
4)复合测试
案例:判断test.c是否是普通文件并且是可读可写
test -f test.c -a -r test.c -a -w test.c
touch test.c
test -f test.c -a -r test.c -a -w test.c
echo "$?"
运行:
5)if语句:
#!/bin/bash
read -p "请输入文件名" filename
if [ -e $filename ];then #判断是否存在文件
if [ -f $filename -a -s $filename ] ;then #判断是否是普通文件和空文件
cat $filename
else
echo "存在但不是普通文件或者文件为空"
fi
else #否则就创建文件,并且输入内容并查看
touch $filename
read -p "请输入文件内容" str
echo "$str" >> $filename
echo "文件内容是:`cat $filename`"
fi
6)elif语句
#!/bin/bash
read -p "请输入你的选择(yes/no)" choice
if [ $choice = "yes" ];then
echo "选择了yes"
elif [ $choice = "no" ];then
echo "选择了no"
else
echo "你选择了其他"
fi
7) case语句
#!/bin/bash
read -p "请输入你的选择(yes/no):" choice
case $choice in
"yes")
echo "你选择的yes"
;;
"no")
echo "你选择的no"
;;
*)
echo "你选择的其他"
exit 1
esac
8)for语句
break 跳出 continue进入下一次循环
形式1:
#!/bin/bash
for filename in `ls`
do
if [ -d $filename ];then
echo "$filename是文件夹"
elif [ -f $filename ]; then
echo "$filename 是普通文件"
fi
done
形式2:
#!/bin/bash
declare num=0
declare i=0;
for ((i;i<=100;i++ ))
do
num+=$i
done
echo "num=$num"
9)while循环
#!/bin/bash
declare -i i=0
declare -i num=0
while [ $i -le 100 ]
do
num+=$i
i=$i+1
done
echo "num=$num"
10)shell函数
#!/bin/bash
declare -i a
my_add()
{
a=$1+$2
return $a
}
read -p "请输入两个相加数" data1 data2
my_add data1 data2
echo "返回值为 $?"
分文件也可以:要使用resouce
myshell1.sh
`#!/bin/bash
declare -i a
my_add()
{
a=$1+$2
return $a
}
myshell.sh
#!/bin/bash
resouce myshell.sh1
read -p "请输入两个相加数" data1 data2
my_add data1 data2
echo "返回值为 $?"