shell脚本入门1


前言

本文为笔者学习笔记,若有不妥之处,欢迎指出。


一、什么是shell脚本?

shell脚本类似windows的批处理文件,shell脚本就是将连续执行的命令写成一个文件。

它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。

二、shell脚本语法

shell脚本是个纯文本文件,命令从上而下,一行一行的开始执行。shell脚本扩展名为.sh。
shell脚本第一行一定要为:

#!/bin/bash

1、第一个shell脚本

#!/bin/bash
echo "hello world!"

使用chmod命令给shell文件加上权限。

chmod 777 demo1.sh 

运行效果如下:

hello world!

2、交互式shell脚本

read [-rs] [-a ARRAY] [-d delim] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [var_name1 var_name2 ...]

read命令用于从标准输入中读取输入单行,并将读取的单行根据IFS变量分裂成多个字段,并将分割后的字段分别赋值给指定的变量列表var_name。第一个字段分配给第一个变量var_name1,第二个字段分配给第二个变量var_name2,依次到结束。如果指定的变量名少于字段数量,则多出的字段数量也同样分配给最后一个var_name,如果指定的变量命令多于字段数量,则多出的变量赋值为空。

选项说明:
-a:将分裂后的字段依次存储到指定的数组中,存储的起始位置从数组的index=0开始。
-d:指定读取行的结束符号。默认结束符号为换行符。
-n:限制读取N个字符就自动结束读取,如果没有读满N个字符就按下回车或遇到换行符,则也会结束读取。
-N:严格要求读满N个字符才自动结束读取,即使中途按下了回车或遇到了换行符也不结束。其中换行符或回车算一个字符。
-p:给出提示符。默认不支持"\n"换行,要换行需要特殊处理,见下文示例。例如,"-p 请输入密码:"
-r:禁止反斜线的转义功能。这意味着""会变成文本的一部分。
-s:静默模式。输入的内容不会回显在屏幕上。
-t:给出超时时间,在达到超时时间时,read退出并返回错误。也就是说不会读取任何内容,即使已经输入了一部分。
-u:从给定文件描述符(fd=N)中读取数据。

利用 read 来实现,代码如下

扫描二维码关注公众号,回复: 13239009 查看本文章
#!/bin/bash
echo "please input name:"
read name
echo "name is " $name

代码说明:
read:获取键盘上的输入,并且赋予name变量

运行结果如下:

please input name:
LiHua
name is  LiHua

实例演示:

#!/bin/bash
read -p "please input your age and height" age heiht
echo "age is $age,height is $height"

运行结果如下:

please input your age and height:20 175
age is 20,height is 175

3、shell脚本实现数值的计算

shell仅支持整形,数值计算使用$((表达式))

代码演示:

#!/bin/bash
read -p "first number:" one
read -p "second number:" second
total=$(($one+$second))			//或total=$((one+second))
echo "$one + $total = $second"

注意事项:千万注意 total= ( ( (( ((one+$second)) 该语句等号两边不能有空格

运行结果为:

first number:12
second number:13
12 + 13 = 25

4、test命令

test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

4.1数值测试

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真

代码演示:

#!/bin/bash

read -p "first number:" one
read -p "second number:" second
if test $[one] -eq $[second];
then
        echo "one == second"
else
        echo "one != second"
fi
total=$(($one+$second))
echo "$one + $second = $total" 

结果如下:

first number:5
second number:5
one == second
5 + 5 = 10

4.2字符串测试

参数 说明
= 等于则为真
!= 不等于则为真
-z字符串 字符串长度为零则为真
-n字符串 字符串长度不为零则为真

代码演示:

#!/bin/bash

buf1="hello world!"
buf2="hello!"

if test $buf1 = $buf2;
then
        echo 'buf1 == buf2'
else
        echo 'buf1 != buf2'
fi

运行结果:

./demo5.sh: line 6: test: too many arguments
buf1 != buf2

4.3文件测试

参数 说明
-e 如果文件存在在则为真
-r 如果文件存在且可读则为真
-w 如果文件存在且可写则为真
-x 如果文件存在且可执行则为真
-s 如果文件存在且至少有一个字符则为真
-d 如果文件存在且为目录则为真
-f 如果文件存在且为普通文件则为真
-c 如果文件存在且为字符型特殊文件则为真
-b 如果文件存在且为块特殊文件则为真

代码演示:

cd /bin

if test -e ./bash;
then
        echo "file is exist"
else
        echo "file is not exist"
fi

运行结果如下:

file is exist

5、中括号[]判断符

[ ] 可以和 ==或 != 配合使用,也可以用来判断文件是否存在。

代码演示:

#!/bin/bash

buf1="hello world!"
buf2="hello!"

["$buf1"=="$buf2"]&&echo "buf1 == buf2"||echo "buf1 != buf2"

运行结果如下:

./demo7.sh: line 6: [hello world!==hello!]: command not found
buf1 != buf2

6、默认变量

0   0~ 0 n,表示shell脚本的参数,包括shell脚本命令本身,shlle脚本命令本身为$0
$#:#表示最后一个参数的标号。
$@:表$1、$2、$3…

代码演示:

#!/bin/bash

echo $0
echo $#
echo $@
echo $1
echo $2
~          

运行结果:

./demo8.sh
2
a b
a
b

猜你喜欢

转载自blog.csdn.net/weixin_51363326/article/details/116607914