(5)Linux Shell脚本编程

1)Shell脚本简介

有shell命令按一定的语法组成的文件

每一个shell程序都可以是一个命令,所有shell可以有无穷的能量来源。

2)shell命令的本质

内置命令、外置命令

如何判断内置命令,还是外置命令?

lzf@ubuntu:~$ type cd
cd is a shell builtin
lzf@ubuntu:~$ type pwd
pwd is a shell builtin
lzf@ubuntu:~$ type ifconfig
ifconfig is /sbin/ifconfig

使用type命令来判断,如cd,pwd是内置命令,ifconfig是外置命令

lzf@ubuntu:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
lzf@ubuntu:~$ sudo vi hello1.c
[sudo] password for lzf: 
lzf@ubuntu:~$ gcc hello1.c -o hello1 
lzf@ubuntu:~$ ./hello1
hello,world!
lzf@ubuntu:~$ sudo mv hello1 /usr/bin/
lzf@ubuntu:~$ hello1 
hello,world!

把hello1.c编译成shell的外置命令

sudo mv hello1  /usr/bin

然后,执行hello1

就能得到结果

3)常用的Shell解释器有哪些?

/etc/shells

lzf@ubuntu:~$ cat /etc/shells 
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
lzf@ubuntu:~$ ls /bin/*sh
/bin/bash  /bin/dash  /bin/rbash  /bin/sh  /bin/static-sh

4)Shell启动方式

- 当程序执行
- 指定解释器运行
- source和.

lzf@ubuntu:~$ sudo vi hello.sh
lzf@ubuntu:~$ sudo chmod 777 hello.sh 
lzf@ubuntu:~$ cat hello.sh 
#!/bin/bash

echo "hello,world!"

lzf@ubuntu:~$ ./hello.sh 
hello,world!
lzf@ubuntu:~$ /bin/bash hello.sh 
hello,world!
lzf@ubuntu:~$ source hello.sh
hello,world!
lzf@ubuntu:~$ . hello.sh
hello,world!

四种执行方式分别为./  ,  /bin/bash  ,  source  ,  .

5)shell脚本定义变量

- variable=value
- variable='value'
- variable="value"

定义变量的时候=号之间是不能有空格的!!

lzf@ubuntu:~$ sudo vi test.sh
lzf@ubuntu:~$ sudo chmod 777 test.sh 
lzf@ubuntu:~$ ./test.sh 
1234
lzf@ubuntu:~$ cat test.sh 
#!/bin/bash

var=1234

echo "$var"

- variable='value'

lzf@ubuntu:~$ sudo vi test.sh
lzf@ubuntu:~$ ./test.sh 
1234 567
lzf@ubuntu:~$ cat test.sh 
#!/bin/bash

var='1234 567'

echo "$var"

- variable="value"

lzf@ubuntu:~$ ./test.sh 
1234 567
lzf@ubuntu:~$ cat test.sh 
#!/bin/bash

var="1234 567"

echo "$var"

6)使用变量

- $variable
- ${variable}

7)将命令的结果赋值给变量

- variable=\`command`

lzf@ubuntu:~$ ./test.sh 
/home/lzf
lzf@ubuntu:~$ cat test.sh 
#!/bin/bash

var="1234 567"
var1=`pwd`
echo "${var1}"


- variable=$(command)

lzf@ubuntu:~$ cat test.sh 
#!/bin/bash

var="1234 567"
var1=$(pwd)
echo "${var1}"

lzf@ubuntu:~$ ./test.sh 
/home/lzf

8)删除变量

- unset

9)特殊变量

lzf@ubuntu:~$ ./test.sh 
./test.sh
lzf@ubuntu:~$ cat test.sh 
#!/bin/bash

var="1234 567"
var1=$(pwd)
unset var
echo "$0"

$0        | 当前脚本的文件名

lzf@ubuntu:~$ cat test.sh 
#!/bin/bash

var="1234 567"
var1=$(pwd)
unset var
echo "$1"
echo "$2"

lzf@ubuntu:~$ ./test.sh 520 17
520
17

 $n(n≥1) | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2

lzf@ubuntu:~$ ./test.sh 520 17
520
17
2
lzf@ubuntu:~$ cat test.sh 
#!/bin/bash

var="1234 567"
var1=$(pwd)
unset var
echo "$1"
echo "$2"
echo "$#"

$#        | 传递给脚本或函数的参数个数。

lzf@ubuntu:~$ ./test.sh 520 17 99 13 14
520
17
520 17 99 13 14
lzf@ubuntu:~$ cat test.sh 
#!/bin/bash

var="1234 567"
var1=$(pwd)
unset var
echo "$1"
echo "$2"
echo "$*"

| $*        | 传递给脚本或函数的所有参数。

lzf@ubuntu:~$ echo "$?"
111

 $?        | 上个命令的退出状态或者获取函数返回值。exit  返回值

lzf@ubuntu:~$ ./test.sh
4324
lzf@ubuntu:~$ cat test.sh 
#!/bin/bash

var="1234 567"
var1=$(pwd)
#unset var
#echo "$1"
#echo "$2"
#echo "$*"
echo "$$"

 $$        | 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。 |

10)字符串拼接

并排放

lzf@ubuntu:~$ ./test.sh
/home/lzfaaa
lzf@ubuntu:~$ cat test.sh 
#!/bin/bash
var1=$(pwd)aaa
echo "${var1}"

11)读取从键盘输入的数据

read

lzf@ubuntu:~$ cat test.sh 
#!/bin/bash
read a
read b
echo "${a}"
echo "${b}"
lzf@ubuntu:~$ ./test.sh
77
520
77
520

如果要提示输入信息的话

read -p "input a:" a
read -p "input b:" b

12)对整数进行数学运算

(())

lzf@ubuntu:~$ ./test.sh
input a:2
input b:2
4
lzf@ubuntu:~$ cat test.sh 
#!/bin/bash
read -p "input a:" a
read -p "input b:" b
var=$(( a+b ))

13)逻辑与/或

```
command1 && command2
```

```
command1 || command2

lzf@ubuntu:~$ ./test1.sh
input a:2
input b:3
a!=b
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash
read -p "input a:" a
read -p "input b:" b
test $a -eq $b || echo "a!=b" 

当command1条件不成立时,才执行command2

14)检测某个条件是否成立

test expression和[ expression ]

lzf@ubuntu:~$ ./test1.sh
input a:2
input b:3
a!=b
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash
read -p "input a:" a
read -p "input b:" b
[ $a -eq $b ] || echo "a!=b" 

| 选 项       | 作 用                                  |
| ----------- | -------------------------------------- |
| -eq         | 判断数值是否相等                       |

lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash
read -p "input a:" a
read -p "input b:" b
test $a -eq $b && echo "a=b" 
lzf@ubuntu:~$ ./test1.sh
input a:2
input b:2
a=b


| -ne         | 判断数值是否不相等                     |
| -gt         | 判断数值是否大于                       |
| -lt         | 判断数值是否小于                       |
| -ge         | 判断数值是否大于等于                   |

lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash
read -p "input a:" a
read -p "input b:" b
[ $a -ge $b ] || echo "a<b" 
lzf@ubuntu:~$ ./test1.sh
input a:2
input b:3
a<b


| -le         | 判断数值是否小于到等于                 |
| -z  str     | 判断字符串 str 是否为空                |

lzf@ubuntu:~$ ./test1.sh
input a:23r
23r
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash
read -p "input a:" a
#read -p "input b:" b
[ -z $a ] || echo "$a" 


| -n  str     | 判断字符串str是否为非空                |
| =和==       | 判断字符串str是否相等                  |
| -d filename | 判断文件是否存在,并且是否为目录文件。 |

lzf@ubuntu:~$ ./test1.sh
input a:/etc	
/etc
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash
read -p "input a:" a
#read -p "input b:" b
[ -d $a ] && echo "$a" 


| -f filename | 判断文件是否存在,井且是否为普通文件。 |
 

lzf@ubuntu:~$ ./test1.sh
input a:123.txt
123.txt
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash
read -p "input a:" a
#read -p "input b:" b
[ -f $a ] && echo "$a" 
lzf@ubuntu:~$ ./test1.sh
input a:jk

15)管道

command1 | command2

lzf@ubuntu:~$ sudo vi test1.sh
lzf@ubuntu:~$ ls | grep "123.txt"
123.txt

当command1成立时,command2才会执行!

16)if语句

 if  condition
then
 ​    statement(s)
fi

lzf@ubuntu:~$ ./test1.sh
input a:1
input b:1
a=b
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash

read -p "input a:" a
read -p "input b:" b

if [ $a -eq $b ]
then
	echo "a=b"
fi	

17)if elif else 语句

 if  condition1
 then
    statement1
 elif condition2
 then
 ​    statement2

 ……
 else
    statementn
 fi

lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash

read -p "input a:" a
read -p "input b:" b

if [ $a -eq $b ]
then
	echo "a=b"
elif [ $a -gt $b ]
then
	echo "a>b"

else
	echo "a<b"
fi	
lzf@ubuntu:~$ ./test1.sh
input a:2
input b:1
a>b
lzf@ubuntu:~$ ./test1.sh
input a:2
input b:1
a>b

18)case in语句

> case expression in
> ​    pattern1)
> ​        statement1
> ​        ;;
> ​    pattern2)
> ​        statement2
> ​        ;;
> ​    pattern3)
> ​        statement3
> ​        ;;
> ​    ……
> ​    *)
> ​        statementn
> esac

lzf@ubuntu:~$ ./test1.sh
input a:3
a!=1&&a!=2
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash

read -p "input a:" a
#read -p "input b:" b

case $a in
	1)echo "a=1";;
	2)echo "a=2";;
	*)echo "a!=1&&a!=2";;
esac

19)for in 循环

 for variable in value_list
 do
 ​    statements
 done

value_list 

- 直接给出具体的值
- 给出一个取值范围
- 使用命令的执行结果
- 使用 Shell 通配符
- 使用特殊变量

lzf@ubuntu:~$ ./test1.sh
1
2
3
4
5
6
7
8
9
10
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash

#read -p "input a:" a
#read -p "input b:" b

for n in {1..10}
do 
	echo "$n"
done
lzf@ubuntu:~$ ./test1.sh
{
ls
/bin/bash
/bin/dash
/bin/rbash
/bin/sh
/bin/static-sh
}
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash

#read -p "input a:" a
#read -p "input b:" b

for n in { ls /bin/*sh }
do 
	echo "$n"
done
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash

#read -p "input a:" a
#read -p "input b:" b

for n in $*
do 
	echo "$n"
done
lzf@ubuntu:~$ ./test1.sh 123456
123456
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash

#read -p "input a:" a
#read -p "input b:" b

for n in $@
do 
	echo "$n"
done
lzf@ubuntu:~$ ./test1.sh 1 2 3 4 5 6
1
2
3
4
5
6
lzf@ubuntu:~$ ./test1.sh 1 2 3 4 5 6
1
2
3
4
5
6
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash

#read -p "input a:" a
#read -p "input b:" b

for n in "$@"
do 
	echo "$n"
done
lzf@ubuntu:~$ ./test1.sh 1 2 3 4 5 6
1 2 3 4 5 6
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash

#read -p "input a:" a
#read -p "input b:" b

for n in "$*"
do 
	echo "$n"
done

"$*"与"$@"的区别

20)while 循环

> while condition
> do
> ​    statements
> done

​
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash

#read -p "input a:" a
#read -p "input b:" b

n=0

while (( n  <10))
do
	echo "${n}"
	n=$(( n+1 ))
done
lzf@ubuntu:~$ ./test1.sh
0
1
2
3
4
5
6
7
8
9

​

21)函数

> function name() {
> ​    statements
> ​    [return value]
> }

lzf@ubuntu:~$ ./test1.sh
lzf
lzf@ubuntu:~$ cat test1.sh 
#!/bin/bash

#read -p "input a:" a
#read -p "input b:" b

function my_name(){
	echo "lzf"

}
my_name

为了以后的image-buide项目,冲冲冲

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值