Shell脚本基本语法

一、shell编程

1.概念

把在终端下执行的LInux命令保存到文件中,这个文件就被称为shell程序

简单的说:shell编程就是对一对Linux命令的逻辑化处理

由于免费和简单易用,bash在工作中被广泛使用,bash也是大多数LInux默认的shell

shell的解析器:ash,bash,ksh,csh等,默认bash

echo $SHELL

shell的作用:

​ a.节省工作时间

​ b.提高工作效率

2.第一个shell程序

特点:扩展名为.sh【pycharm.sh】

​ 文件名尽量遵循标识符的规则【全英文/英文 + 数字】

代码:

#!/bin/bash

echo "hello world"

运行方式:

rock@rockrong:~$ cd Desktop/
rock@rockrong:~/Desktop$ mkdir shellPro
rock@rockrong:~/Desktop$ cd shellPro/
rock@rockrong:~/Desktop/shellPro$ touch first.sh
rock@rockrong:~/Desktop/shellPro$ vim first.sh 
rock@rockrong:~/Desktop/shellPro$ ll
总用量 12
drwxrwxr-x 2 rock rock 4096 8月  23 09:46 ./
drwxr-xr-x 3 rock rock 4096 8月  23 09:44 ../
-rw-rw-r-- 1 rock rock   32 8月  23 09:46 first.sh
rock@rockrong:~/Desktop/shellPro$ chmod a+x first.sh 
rock@rockrong:~/Desktop/shellPro$ ll
总用量 12
drwxrwxr-x 2 rock rock 4096 8月  23 09:46 ./
drwxr-xr-x 3 rock rock 4096 8月  23 09:44 ../
-rwxrwxr-x 1 rock rock   32 8月  23 09:46 first.sh*
rock@rockrong:~/Desktop/shellPro$ first.sh
first.sh:未找到命令
rock@rockrong:~/Desktop/shellPro$ ./first.sh 
hello world
rock@rockrong:~/Desktop/shellPro$ /bin/bash first.sh 
hello world
rock@rockrong:~/Desktop/shellPro$ sh first.sh 
hello world
rock@rockrong:~/Desktop/shellPro$ touch varDemoo01
rock@rockrong:~/Desktop/shellPro$ vim varDemoo01 
rock@rockrong:~/Desktop/shellPro$ sh varDemo01
sh: 0: Can't open varDemo01
rock@rockrong:~/Desktop/shellPro$ /bin/bash varDemoo01 
name
rock@rockrong:~/Desktop/shellPro$ vim varDemoo01 
rock@rockrong:~/Desktop/shellPro$ /bin/bash varDemoo01 
zhangsan
18
rock@rockrong:~/Desktop/shellPro$ vim varDemoo01 
rock@rockrong:~/Desktop/shellPro$ /bin/bash varDemoo01 
zhangsan
18
zhangsan
his name is zhangsan
lisi
rock@r
3.shell基本语法
3.1变量

定义:变量名=值

普通变量

只读变量:readonly xxx,只能获取,不能重新赋值

删除变量:unset xxx,变量被删除之后将不能使用,注意:只读变量不能删除【删除变量的特点:不会报错,会输出空内容】

#!/bin/bash

#变量的定义
name="zhangsan"
age=18
echo $name
echo $age

#建议书写成标准写法
echo ${name}
echo "his name is ${name}"

#重新赋值
name="lisi"
echo ${name}

#只读变量
num=10
echo $num
#readonly num
num=20

#删除变量
url="www.baidu.com"
unset url
echo $url
3.2字符串

【面试题:区分shell中的单引号,双引号和反引号】

单引号:其中的任何字符都会原样输出,而且单引号中的变量是无效的,单引号中不能使用单引号【即使使用\转义也不行】

双引号:跟Python类似,表示一个普通的字符串,可以包含大多数的特殊字符【除$,·,,"之外】

反引号:将其中的内容作为命令执行

注意:在shell的字符串中,也可以使用\进行转义

#!/bin/bash

#定义字符串
str1="hello"
str2="${str1} world"
str3="\"${str1}\" world"
echo $str1
echo $str2
echo $str3

#拼接字符串
echo $str2 $str3

#获取字符串的长度
echo "str1的长度为:${#str1}"

#提取子字符串
s1="abcdef12536124"
echo ${s1:1:4}

#反引号
echo 'expr 2+3'
echo "expr 2+3"
#注意:expr是一个命令,表示一条语句,会进行指定的运算
#注意:2 + 3必须出现空格
echo `expr 2 + 3`


#查找子字符串
#注意:index的作用:获取一个子字符串在源字符串中第一次出现的位置
s2="this is a test"
echo `expr index "$s2" is`
3.3数组array

bash支持一维数组【不支持多维数组】,并且没有设定数组的大小

数组元素的下标从0开始的,通过下标获取数组中的元素,

定义:数组名=(元素1 元素2 元素3…)

注意:元素之间使用空格隔开

工作原理:bash中的数组类似于c语言中数组,数组名称相当于是一个指针,默认指向数组中第0个下标对应的元素

#:获取长度,相当于len
*/@:代表所有,表示可以获取数组中的所有元素

#!/bin/bash

#定义数组
arr1=(1 2 3 4)
arr2=(
10
20
30
40
)
echo $arr1
echo $arr2

#获取数组中的元素
echo ${arr2[2]}
#获取数组中的全部元素
echo ${arr2[@]}
echo ${arr2[*]}

#获取数组的长度
echo ${#arr2[*]}
echo ${#arr2[2]}
3.4运算符
a.基本运算符

	算术运算符:+   -     \*     /    %
	关系运算符:>  <  == 
	           -gt[greater than]   -lt[less than]   -ge   -le   -eq
	逻辑运算符:&&【与】  ||【或】   !【非】
	
b.文件检测运算符
	-r:文件是否可读
	-w;文件是否可写
	-f:路径是否是文件【isfile】
	-d:路径是否是目录【isdir】
	-e:路径是否存在【exits】
	
#!/bin/bash

file="/home/rock/Desktop/shellPro/first.sh"

if [ -e $file ];
then
echo "是存在的"
fi

if [ -f $file ];
then
echo "是文件"
fi

if [ -w $file ];
then
echo "是可写的"
fi
3.5echo、test、printf命令
#-e表示开启转义,\n表示换行,\c表示不换行
echo -e "xxx \n"
echo -e "xxx \c"

#!/bin/bash


echo "afha"
echo fhajhfja

echo `date`
echo `cal`


echo -e "ok \n"
echo "this is a text"

echo -e "ok~~~\c"
echo "this is a text"

printf不会像echo进行自动换行,可以对数据进行格式化

%s:字符串  %c:字符  %d:整型   %f:浮点型
%-10s:指定一个宽度为10的字符串,-表示左对齐,没有则表示右对齐,任何字符都会显示在10个字符范围内,如果不足则使用空格填充
%-4.2f:指的是格式化小数,其中.2表示保留小数点后2位

#!/bin/bash

printf "%-10s %-8s %-4s\n" 姓名 年龄  体重
printf "%-10s %-8s %-4.2f\n" zhangsan 10  172.8977
printf "%-10s %-8s %-4s\n" 姓名 年龄  188.9
printf "%-10s %-8s %-4s\n" 姓名 年龄  176.44

test:用于检测某个条件是否成立,他可以进行数字,字符和文件的三种检测

!/bin/bash

num1=100
num2=200

if [ $num1 -eq $num2 ];
then
echo "相等"
fi

if [ $num1 == $num2 ];
then
echo "相等"
fi

if test $num1 -eq $num2;
then
echo "ok"
fi

str1="abc"
str2="abc"

if [ $str1 == $str2 ];
then
echo "1111"
fi

if test $str1 == $str2;
then
echo "2222"
fi


cd /home
if test -e ./rock;
then
echo "存在"
fi

3.6流程控制语句

a.分支语句

if语句

case语句

!/bin/bash

echo "请输入1到4的数字:"
echo "你输入的数字为:"
read num

#注意:case可以和if多分支进行等价转换
case $num in
1)  echo "1111"
;;
2)  echo "2222"
;;
3)  echo "333"
;;
4) echo "4444"
;;
*)  echo "输入有误"
;;
esac

if [ $num == 1 ]
then
echo "111"
elif [ $num == 2 ]
then
echo "222"
else
echo "输入有误"
fi

#练习
#1.从终端输入一个数,判断该数是否是偶数
#2.从终端输入一个数,输出对应的星期英文

b.循环语句

for循环

while循环

until循环

!/bin/bash

#for循环
#遍历数组
arr1=(34 546 6 76)
for num in ${arr1[*]}
do
echo "for语句:${num}"
done

for num in 34 546 6 76
do
echo "arr:${num}"
done

#遍历字符串
for s in "this is a text"
do
echo ${s}
done

#while循环
#需求:打印1~5的数字
n1=1
while [ $n1 -le 5 ]
do
echo $n1
let "n1++"
done

n2=1
while (($n2<=5))
do
echo $n2
n2=$[$n2+1]
done

n3=1
while [ $n3 -le 5 ]
do
echo $n3
((n3++))
done
#until
i=1
until [ $i -gt 5 ]
do
echo "until:$i"
((i++))
done

#练习:求1~100之间所有整数的和
num=1
total=0
while [ $num -le 100 ]
do
total=$[$total+$num]
num=$[$num+1]
done

echo $total

3.7函数
#!/bin/bash

#无惨无返回值函数
func1()
{
echo "hello"
}
#调用函数:只需要书写函数名即可
func1

#返回值
#需求:从控制台read进来两个数,求两个书的和
total()
{
echo "该函数对两个书进行求和运算"
echo "请输入第一个数:"
read num1
echo "请输入第二个数:"
read num2

# sum=$[$num1+$num2]

return $(($num1+$num2))
}
total
#获取一个函数的返回值,通过$?获取
echo "输入的两个数字之和为:$?"


#有参数
#参数用$1   $2。。。表示

func2()
{
echo "该函数用于求和"
echo $1
echo $2
return  $(($1+$2))
}
func2 23 6
echo "和:$?"


4.练习
#1.书写脚本,判断传入的参数的个数
#!/bin/bash
num=$#
echo $num

#2.书写脚本,把命令行传入的两个参数比较,相等输出equal
#!/bin/bash
if test $# -eq 2
then 
	if test $1 -eq $2
	then
	   echo "相等"
	else
	   echo "不相等"
	fi
else
echo "参数个数不是两个"
fi


#3.书写脚本,以指定目录为参数,生成该目录的压缩备份
#!/bin/bash
path=$1

if [ -e $path ]
then
	if [ -d $path ]
	then 
     gzip -r $path
  else
     gzip $path
  fi
else:
echo "路径不存在"
fi


#4.遍历数组中的所有元素     	
#!/bin/bash
arr1=(43 5 6)
for num in ${arr1[*]}
do
echo $num
done

#5.求数组中的元素之和
#!/bin/bash
arr1=(43 5 6)
total=0
for num in ${arr1[*]}
do
total=$[$total+$num]
done
echo $total

arr1=(43 5 6)
total=0
i=0
while [ $i -lt ${#arr1[@]} ]
do
total=$[$total+${arr1[$i]}]
i=$[$i+1]
done
echo $total


#6.书写脚本,往mylog.log文件中追加信息“this is a text”
#!/bin/bash
#sed -i '/$/a\this is a text'  mylog.log   #问题:会在匹配到的每一行的行尾追加内容

echo "this is a text" >> mylog.log

#7.定义函数,生成n~m的连续整数
#!/bin/bash
echo $RANDOM     #生成0~32767之间的整数随机数

func()
{
 min=$1
 max=$(($2-$min+1))
 num=$(($RANDOM+100000000))
 return $(($num%$max+$min))
}
func 10 100
echo $?

#8.某log文件有很多行,每行输出包含info/debug/error字样,书写脚本,将log文件名当参数输入,统计包含error的行有多少行
#!/bin/bash
path=$1

cat $path | grep -c error


#9.书写脚本,实现git文件的提交和推送过程
#!/bin/bash

#需要add的文件名称
path=$1
#提交的日志
log=$2
#推送到远程分支
branch=$3

echo "开始添加。。。。"
git add $path
echo "添加成功!"
echo "开始提交。。。。"
git commit -m $log
echo "提交成功!"
echo "从远程仓库进行抓取。。。"
git pull
echo "抓取成功!"
echo "开始推送。。。。"
git push origin $branch
echo "推送成功!"

#运行:/bin/bash xxxx.sh   a1.txt   "create a1 file"  master

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值