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项目,冲冲冲