一、什么是shell
1、查看当前shell
[user@bogon ~]$ echo $SHELL
/bin/bash
[user@bogon ~]$ ls -l /bin/bash
-rwxr-xr-x. 1 root root 964536 4月 1 2020 /bin/bash
2、搭建运营环境
(1)第一种方法是确保我们执行的命令具有可执行权限,然后直接键入该命令执行它:
$ chmod +x /path/to/test.sh
$ /path/to/test.sh
(2)直接把脚本作为 Bash 解释器的参数传入:
$ bash /path/to/test.sh
或
$ source /path/to/test.sh
或
$ . /path/to/test.sh
二、基本语法
运行第一个程序Hello,World
方法1:使用chmod命令
[user@bogon ~]$ vim test.sh
[user@bogon ~]$ chmod +x test.sh
[user@bogon ~]$ ./test.sh
Hello,world
方法2:直接使用 bash 目录/文件名
[user@bogon ~]$ bash ./test.sh
Hello,world
[user@bogon ~]$
三、变量
1、变量的分类
1.用户自定义变量
由用户自定义、修改和使用
2. shell 环境变量
由系统维护,用于设置用户的shell工作环境
只有少数的变量用户可以修改其值
3. 位置参数变量(positional parameters)
通过命令给程序传递执行参数
可以用shift命令实现位置参数的迁移
4. 专用参数变量 (special parameters)
bash 预定义的特殊变量
用户不能修改其值
(1)定义变量
- variable=value
- variable=‘value’
- variable=“value”
注意:
如果value不包含任何空白字符,就可以不使用引号
如果有必须使用引号
赋值**=**的周围一定没有等号
(2)shell 变量的命名规范
- 变量名由数字、字母、下划线组成
- 必须以字母或者下划线开头
- 不能使用shell里的关键字
定义变量的示例:
#! /bin/bash
url=http://c.baincheng.net//shell
echo $url
name='R语言中国网'
echo $name
author="hahha"
echo $author
(3)使用变量
author="haha"
echo $author
echo ${author}
注意:花括号{ }是可选的加不加都可以,家的话是未来帮助解释器识别变量
例子:
skill="ptthon"
echo "I my godda at ${kill}"
如果不给skil 变量花“,写echo I am good at $skillScriot ”,解释器就回把当前的变量(其值为空)
(4)修改变量的值
就是重新使用变量赋值就是变量名字+赋值内容
第二次赋值时不能在变两面前加$
(5) 单引号和双引号的区别
- 单引号:引号中是什么就原样输出
- 双引号:输出时先解析里面的变量,建议使用双引号
(6)将命令结果赋值给变量
- variable=
command
- variable=$(command)
示例:
[root@xueai8 shell]# log=$(cat test.sh)
[root@xueai8 shell]# echo $log
echo -e "hello \n world!" url="1233445566" echo ${url:2:9} echo ${url%33*} i=10; ((i++)) echo $i
[root@xueai8 shell]# log =`cat test.sh`
-bash: log: 未找到命令
[root@xueai8 shell]# log=`cat test.sh`
[root@xueai8 shell]# echo
[root@xueai8 shell]# echo $log
echo -e "hello \n world!" url="1233445566" echo ${url:2:9} echo ${url%33*} i=10; ((i++)) echo $i
[root@xueai8 shell]#
四、内部变量
- $#:传送给shell程序的位置参数的数量
- $?:最后命令完成码或在shell程序内执行shell程序(返回值)
- $0:shell程序的名称
- $*:调用shell 程序时所传送的全部参数的单字字符
- $@:“参数1”,“参数2”……形式保存的参数
- $n:第n个参数
- $$ :本程序的pid
- $!:上一个命令的pid
示例:
echo "当前程序的名字是$0"
echo "一共输入$#个参数,全部参数是$@,第一个参数是$1"
echo "当前进程pid是$$"
echo "执行完毕,返回$?"
测试:
[root@xueai8 shell]# cat hello.sh
echo "当前程序的名字是$0"
echo "一共输入$#个参数,全部参数是$@,第一个参数是$1"
echo "当前进程pid是$$"
echo "执行完毕,返回$?"
[root@xueai8 shell]# sh hello.sh hello world ok
当前程序的名字是hello.sh
一共输入3个参数,全部参数是hello world ok,第一个参数是hello
当前进程pid是42291
执行完毕,返回0
五、字符串的长度
语法实现: == ${#string_name}==其中string_name 为字符串的名字
示例;
#! /bin/bash
str="hello world!"
echo ${#str}
#位置参数长度
n=$1
echo ${#n}
echo ${#1}
测试:
[root@xueai8 shell]# sh demo4.sh hahhahhahahh
12
12
12
六、字符串的拼接
将两个字符串并排放在一起就能实现拼接
示例:
#! /bin/bash
name="shell"
url="www.baidu.com"
str1=$name$url #中间不能有空格
str2="$name $url" #双引号中间可以有引号
str3=$name":"$url #中间可以出现其它字符
str4="$name:$url"
str5="${name}script:${url}index.html"
echo $str1
echo $str2
echo $str3
echo $str3
echo $str4
echo $str5
测试:
[root@xueai8 shell]# sh demo5.sh
shellwww.baidu.com
shell www.baidu.com
shell:www.baidu.com
shell:www.baidu.com
shell:www.baidu.com
shellscript:www.baidu.comindex.html
[root@xueai8 shell]#
七、字符串的截取 (和其他编程一样下标从0开始)
格式 | 说明 |
---|---|
${string:start:length} | 从string字符串的左边第start个字符串开始,向右边截取length个字符 |
${string : start} | 从string字符串的左边第start字符开始截取 ,直到最后 |
${string : 0-start : length} | 从string字符串右边第start字符开始,向右截取length个字符 |
${string:0-start} | 从右边第start字符开始截取,知道最后 |
${string#*chars} | 字符串第一次出现chars的位置开始,截取chars右边的所有字符 |
${string##*chars} | 从字符串最后一次出现*chars的位置开始,截取右边的所有字符 |
${string%*chars} | 从字符串第一次出现*chars的位置开始,截取左边的所有字符 |
${string%%*chars} | 从字符出啊最后一次出现的*chars的位置开始,截取左边的所有字符 |
示例:
name="quiichicnkjdjdoaskajskjdoidj"
echo ${name:0:3}
echo ${name:2}
echo ${name:0-5:5}
echo ${name:0-2}
echo ${name#*chi}
echo ${name##*chi}
echo ${name%*chi}
echo ${name%%*chi}
测试:
[root@xueai8 shell]# sh demo6.sh
qui
iichicnkjdjdoaskajskjdoidj
doidj
dj
cnkjdjdoaskajskjdoidj
cnkjdjdoaskajskjdoidj
quiichicnkjdjdoaskajskjdoidj
quiichicnkjdjdoaskajskjdoidj
八、shell中表达式计算
1.使用expr外部表达式
示例:
r=`expr 4 + 5`
echo $r
j=`expr 4*5`
echo $j
~
测试:
[root@xueai8 shell]# sh demo7.sh
9
20
2.使用$((command))
示例:
r1=$((3 + 6))
echo $r1
测试:
[root@xueai8 shell]# sh demo7.sh
9
3.使用$[]
示例:
i=10
r2=$[$i+5]
echo $r2
测试:
[root@xueai8 shell]# sh demo7.sh
15
4.各种运算的写法
除法:
乘法:
余数:
乘幂:
实现:
#!/bin/bash
r1=`expr 40 / 5`
r2=$((40/5))
r3=$[40/5]
echo "r1=$r1"
echo "r2=$r2"
echo "r3=$r3"
# 乘法
r3=`expr 4 \* 5`
r4=$((4*5))
r5=$[4*5]
echo "r3=$r3"
echo "r4=$r4"
echo "r5=$r5"
#余数
r6=`expr 100 % 43`
r7=$((100%43))
r8=$[100%43]
echo "r6=$r6"
echo "r7=$r7"
echo "r8=$r8"
#乘幂
r9=$((2**3))
r10=$[2**3]
echo "r9=$r9"
echo "r10=$r10"
# expr没乘
测试:
[root@xueai8 shell]# sh demo8.sh
r1=8
r2=8
r3=8
r3=20
r4=20
r5=20
r6=14
r7=14
r8=14
r9=8
r10=8
4.使用let命令
let命令是bash中用于计算的工具
示例:
#!/bin/bash
n=10
let n=n+1
echo $n
let m=n*10
echo $m
let r=m/10
echo $r
let r1=m%7
echo $r
let a=m**2
echo $a
测试:
[root@xueai8 shell]# sh demo9.sh
11
110
11
11
12100
5.数字处理-bc计算器
- bc工具的退出命令为quit
- 精度设置对于除法有效,其他算法不一定有效,为了使精度设置生效,可在算式末尾以”/1”结束
示例:
[root@xueai8 shell]# echo 'scale=1;3/2'|bc
1.5
示例2:
#!/bin/bash
n=$(bc<<eof
scale=2
a=10
b=20
print 7/2
eof
)
echo $n
b=10
h=5
area=$(echo "scale=2;(1/2) * $b * $h"|bc)
echo $area
测试:
[root@xueai8 shell]# sh test1.sh
3.50
25.00