1. Shell 脚本介绍
Shell 本身是一个用 C 语言编写的程序, Shell 作为命令语言时,可以交互式地解释和执行用户输入的命令;作为程序设计语言时,支持定义各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
shell 脚本的后缀一般是.sh,后缀只是方便用户部分这是个脚本文件。就像 windows 下的.bat 后缀文件一样的道理。
Shell 脚本不需要编译,是依靠解析器解析运行,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。所以效率上是没有编译型语言速度快,不适合写大量运算的代码。
Linux 下的 Shell 解释器种类众多,当前系统的支持的解释器可以在/etc/shells 文件里查看:
[wbyq@wbyq linux_c]$ cat /etc/shells/bin/bash/sbin/nologin/bin/tcsh/bin/csh
复制代码
查看当前系统默认的 shell:
[xiao@localhost file_2]$ ls -l /bin/shlrwxrwxrwx 1 root root 4 05-25 19:24 /bin/sh -> bash
复制代码
如果在脚本里想使用其他解释器,可以使用以下语法进行指定:
#!告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序
下面就介绍 Shell 脚本的基础语法规则、基本使用案例。
2. Shell 脚本的基本语法规则
创建一个简单的脚本文件并运行:
[wbyq@wbyq linux_c]$ vim shell.sh[wbyq@wbyq linux_c]$ ls /bin/sh -llrwxrwxrwx. 1 root root 4 7月 1 2019 /bin/sh -> bash[wbyq@wbyq linux_c]$ lsshell.sh[wbyq@wbyq linux_c]$ ./shell.sh 12345jsdsdsd[wbyq@wbyq linux_c]$ sh shell.sh 12345jsdsdsd
复制代码
Shell 脚本一些规则总结:
在脚本代码里 #表示注释,并且只是支持单行注释.
#! 是用来指定脚本解释器,#!是一个整体. 比如: #!/bin/bash
脚本文件编写之后需要将文件权限改为可执行才可以直接运行
3. shell 变量基本使用
#!/bin/bashcnt=12345echo "$cnt"echo "${cnt}"echo "${cnt}67890abcd"
int_a=6666abcd="hello"float_c=123.456char_d='A'printf "%d,%f,%c,%s\n" $int_a $float_c $char_d $abcd
复制代码
4. 获取命令行传递的参数
#!/bin/bashprintf "脚本名称:$0\n"printf "第一个参数:$1\n"printf "第二个参数:$2\n"printf "第三个参数:$3\n"printf "所有参数:$*\n"printf "参数总个数:$#\n"rm 123.cprintf "上一个命令执行状态:%d\n" $?
复制代码
5. 算术运算符
#!/bin/basha=10b=20c=30d=`expr $a + $b + $c`printf "d=$d\n"
d=`expr $a \* $b`printf "d=$d\n"
d=`expr $a '*' $b`printf "d=$d\n"
d=`expr \( 12 + 66 + 77 \) \* 12`printf "d=$d\n"
复制代码
6. if 语句基本用法
基本语法格式:#!/bin/bashif [ 123 -eq 123 ]then printf "相等\n"fi
if [ 123 -eq 456 ]then printf "相等\n"else printf "不相等\n"fi
if [ 123 -eq 456 ]then printf "123 -eq 456 相等\n"elif [ 456 -eq 888 ]then printf "456 -eq 888 相等\n"elif [ 456 -eq 456 ]then printf "456 -eq 456 相等\n"else printf "123 -eq 456 不相等\n"fi
if [ 123 -eq 123 -a 456 -eq 456 ]then printf "相等1\n"fi
if [ 123 -eq 123 -o 456 -eq 457 ]then printf "相等2\n"fi
if [ 123 -eq 123 -o 456 -eq 457 ] && [ 123 -eq 123 -a 456 -eq 457 ]then printf "相等3\n"fi
if [ 123 -eq 123 -o 456 -eq 457 ] || [ 123 -eq 123 -a 456 -eq 457 ]then printf "相等4\n"fi
复制代码
7. 如何从键盘上输入数据?
#!/bin/bashread -p "请输入一个整数:" dataprintf "你输入的整数:%d\n" ${data}
printf "请输入一个浮点数:"read f_dataprintf "你输入的浮点数:%f\n" ${f_data}
read -t 3 -p "输入一个字符串:" str_dataif [ $? -eq 0 ]then printf "你输入的字符串:%s\n" $str_dataelse printf "你输入太慢了.\n"fi
read -s -p "请输入密码:" passprintf "你输入的密码:%s\n" $pass
复制代码
8. 判断平年和闰年
#!/bin/bashread -p "请输入年份:" year
#1. 能被4整除 并且不能被100整除#2. 能被400整除if [ `expr $year % 4` -eq 0 -a `expr $year % 100` -ne 0 ] || [ `expr $year % 400` -eq 0 ]then printf "%d 是闰年.\n" $yearelse printf "%d 是平年.\n" $yearfi
if [ `expr $year % 4` -eq 0 -a `expr $year % 100` -ne 0 ]then printf "%d 是闰年.\n" $yearelif [ `expr $year % 400` -eq 0 ]then printf "%d 是闰年.\n" $yearelse printf "%d 是平年.\n" $yearfi
复制代码
9. for 循环的基本使用
#!/bin/bashfor data in 1 2 3 4 5 6 7 9 0do if [ $data -eq 5 ] then break 1 fi printf "data1=%d\n" $datadone
for data in 1 2 3 4 5 6 7 9 0do if [ $data -eq 5 ] then continue fi printf "data2=%d\n" $datadone
for file_name in *.shdo printf "file_name=%s\n" $file_namedone
for file_name in /home/wbyq/*.shdo printf "file_name=%s\n" $file_namedone
复制代码
10. 使用 for 循环输出 9*9 乘法口诀表
#!/bin/bashfor i in 1 2 3 4 5 6 7 8 9do for j in 1 2 3 4 5 6 7 8 9 do printf "%d*%d=%d " $j $i `expr $i '*' $j` if [ $i -eq $j ] then break 1 fi done printf "\n"done
[wbyq@wbyq linux_c]$ ./shell.sh 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
复制代码
11. while 循环基本用法
#!/bin/bash
#无限循环的编写案例#while :#do# printf "hello\n"# sleep 1#done
#常规用法cnt=0while [ $cnt -lt 10 ]do printf "cnt=%d\n" $cnt cnt=`expr $cnt + 1`done
复制代码
12. 使用 while 循环输出 9*9 乘法口诀表
#!/bin/bashi=1while [ $i -lt 10 ]do j=1 while [ $j -le $i ] do printf "%d*%d=%d " $j $i `expr $j \* $i` j=`expr $j + 1` done printf "\n" i=`expr $i + 1`done
[wbyq@wbyq linux_c]$ ./shell.sh 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
复制代码
评论