目录



  • 参考地址:http://c.biancheng.net/cpp/view/6995.html

一:shell基础语法

1: 脚本的基础


  • 1: shell脚本命名规范: ​.sh结尾​。
  • 2: shell脚本初始必须定义解释环境: ​#!/usr/bin/bash
  • 3: ​shell脚本不允许写中文​。
  • 4: 脚本描述:作者, 创建时间,版本,脚本描述。
#!/usr/bin/bash
#Author: liangShan
#Created Time:2021/08/30
#Release: 1.0
#Script Description: nginx install script

  • 5: 脚本组成 :

  • 解释环境: #!/usr/bin/env
  • 注释说明:
  • 执行代码:

  • 6: 脚本的运行:

  • 1: 增加执行权限:

chmod +x 脚本名
./脚本

​ ​

  • 2: 解释器直接运行:​​bash 脚本 ​
  • 7: shell中的特殊符号:shell脚本基础_运算符
  • 8: 常见的几种shell :

  • cat / etc/shells : 查看shell的命令:
  • 常用的就是: ​sh, bash, dash

renshanwen@A230604-nc01:~$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen

​ ​

  • 查看默认的shell:
renshanwen@A230604-nc01:~$ echo $SHELL
/bin/bash

2: shell命令:

2.1:shell提示符(了解):


  • shell中的提示符格式通过: PS1,和PS2两个变量来空值。
  • 例如: 下面第一个是PS1格式,第二个是PS2格式。

renshanwen@A230604-nc01:~$ echo "liangshan"
liangshan
renshanwen@A230604-nc01:~$ echo "
> liang
> shan
> "

liang
shan

2.2: shell变量:


  • shell中变量只有一种类型: 字符串​。
  • 变量的定义:
变量名=值
变量名='值'
变量名="值"

​ ​


  • 1: ​两边不能有空格​。
  • 2: 变量名: ​数字,字母,下划线构成,字母,下划线开头​。

  • 变量的使用: ​推荐使用{}
${变量}
$变量

​ ​

  • 单引号和双引号的区别:

  • 单引号不能解释变量
  • 案例:

#!/bin/bash
# Author: renshanwen
user="liangshan"
full_name='我是:${user}'
full_name2="我是:${user}"
echo $full_name
echo $full_name2
  • ​ ​
  • 命令的结果赋值给变量:
renshanwen@A230604-nc01:~$ vim test.sh
renshanwen@A230604-nc01:~$ ./test.sh
我是:${user}
我是:liangshan


  • 变量=$(命令)
  • 只读变量:
  • readonly 变量名
  • 删除变量:
  • unset 变量名

2.3: shell特殊变量:

变量

含义

$0

当前脚本的名称。

$n

传递给脚本的参数: $1就是第一个参数。

$#

传递给脚本参数的个数​。

$*

传递给脚本的所有参数。

$@

传递给脚本的所有参数。在被双引号包含的时候会略有不同。

$?

上个命令的退出状态/函数的返回值​。一般命令0表示成功,1表示失败。s

$$

当前shell的进程ID


  • 案例:
renshanwen@A230604-nc01:~$ ./test.sh aaa bbb
File Name: ./test.sh
First Parameter: aaa
Second Parameter: bbb
Quoted Values: aaa bbb
Quoted Values: aaa bbb
Total Number of Parmaeters: 2


* #!/bin/bash
# Author: renshanwen
echo "File Name: $0"
echo "First Parameter: $1"
echo "Second Parameter: $2"
echo "Quoted Values: $@"
echo "Quoted Values: $*"
echo "Total Number of Parmaeters: $#"
  • ​$*和$@​​的区别:
#!/bin/bash
echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\$@=" $@
echo "\"\$@\"=" "$@"
echo "print each param from \$*"
for var in $*
do
echo "$var"
done
echo "print each param from \$@"
for var in $@
do
echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
echo "$var"
done
echo "print each param from \"\$@\""
for var in "$@"
do
echo "$var"
done
$*=  a b c d
"$*"= a b c d
$@= a b c d
"$@"= a b c d
print each param from $*
a
b
c
d
print each param from $@
a
b
c
d
print each param from "$*"
a b c d
print each param from "$@"
a
b
c
d
  • ​$*​​当被双引号包围时,打印出来的参数是一个整体。但是​​$@​​打印出来的会是单个的参数。

2.4:替换:


echo -e ”字符串“: 表示对字符串内部进行转义
#!/bin/bash
# Author: renshanwen
a=10
echo -e "Value is $a \n"
  • 转义字符含义
    shell脚本基础_linux_02


  • 命令替换:
#!/bin/bash
# Author: renshanwen
DATA=`date`
echo "Data is $DATA"

USERS=`who | wc -l`
echo "Logged in user $USERS"

UP=`date ; uptime`
echo "UP time is $UP"

​ ​

  • 命令替换是指​Shell可以先执行命令,将输出结果暂时保存,在适当的地方输出​。
  • 变量替换:
    shell脚本基础_运算符_03

2.5: 字符串:


  • 单引号
  • 双引号:
  • 双引号可以有变量,也可以出现转义字符。
  • 字符串拼接:
#!/bin/bash
# Author: renshanwen
my_name="liangshan"
my_full_name="名字: "$my_name"!"
echo $my_full_name
运行结果:
renshanwen@A230604-nc01:~$ ./test.sh
名字: liangshan!


#!/bin/bash
# Author: renshanwen
my_name="liangshan"
my_full_name="名字: ${my_name}!"
echo $my_full_name
renshanwen@A230604-nc01:~$ ./test.sh
名字: liangshan!
  • 可以使用引号,也可以使用${}
  • 获取字符串长度:
#!/bin/bash

# Author: renshanwen

my_name="liangshan"

my_full_name="名字长度: ${#my_name}!"

echo $my_full_name
运行结果:
renshanwen@A230604-nc01:~$ ./test.sh
名字长度: 9!


  • ${#变量名}
  • 提取子字符串:
#!/bin/bash

# Author: renshanwen

my_name="liangshan"

echo ${my_name:0:5}
# 输出: liang
  • ${变量名:起始下标: 个数}

2.6: 数组:


  • 1: 数组定义:

  • array_name=(value1 value2)​, 注意变量与变量之间没有逗号。
  • array_name[0]=value1

  • 2: 读取数组:

  • ${数组名[index]}
  • 获取数组中所有元素: ${数组名[*]}

  • 3: 获取数组的长度:
  • ${#数组名[*]}

#!/bin/bash
# Author: renshanwen
my_array=("1" "2" "3")
echo "数组第一个元素是: ${my_array[0]}"
echo "数组的所有元素是: "${my_array[*]}
echo "数组长度是:${#my_array[*]}"

renshanwen@A230604-nc01:~$ ./test.sh
数组第一个元素是: 1
数组的所有元素是: 1 2 3
数组长度是:3

2.7: 运算符:


  • 算数运算符:

  • 我们经常使用expr进行算数运算:
  • 表达式和运算符之间要有空格。
  • 完整的表达式用``包含。

#!/bin/bash
# Author: renshanwen
val=`expr 2 + 2`
echo "运算结果是:$val"
  • ​ ​

算数运算符列表:

shell脚本基础_数组_04
  • 关系运算符:

shell脚本基础_运算符_05



  • 关系运算符只支持: 数字,不支持字符串。
  • 布尔运算符:shell脚本基础_运算符_06


  • 字符串运算符:shell脚本基础_bash_07

二: shell分支循环

2.1: 条件分支:


  • 1: 最简单的if语句: a 不等于b则输出。

#!/bin/bash

# Author: renshanwen

a=10
b=20

if [ $a != $b ]
then
echo "a is not equal to b"
fi
  • 2: if else语句:
#!/bin/bash

# Author: renshanwen

a=10
b=10

if [ $a != $b ]
then
echo "a is not equal to b"

else
echo "a is equal to b"
fi
  • 3: 多分支选择结构:
#!/bin/bash

# Author: renshanwen

a=10


if [ $a -lt 10 ]
then
echo "a 小于 10"

elif [ $a -lt 20 ]
then
echo "a 小于20,大于等于10"
else
echo "a 大于20"

fi
  • ​ ​
  • 4: 与test命令配合使用:
#!/bin/bash

# Author: renshanwen

a=$[10*20]
b=$[20*10]

if test $[a] -eq $[b]
then
echo "两者相等"
else
echo "两者不相等"
fi

2.2: 循环:


  • 1: 使用while循环打印1到100
#!/bin/bash
# Author: renshanwen
COUNTER=0

while [ $COUNTER -lt 100 ]
do
COUNTER=`expr $COUNTER + 1`
echo $COUNTER
done
  • 2: 使用while循环读取变量信息:
#!/bin/bash
# Author: renshanwen
while read FILM
do
echo "输入的内容是:$FILM"
done

  • 键盘输入的信息,保存在变量: FILM中​。
  • 按Ctrl + D结束循环​。

  • 3: until循环:

  • 直到某个条件成立才终止。
  • 案例: 打印0到10

#!/bin/bash
# Author: renshanwen
COUNT=0

until [ $COUNT -gt 10 ]
do
echo $COUNT
COUNT=`expr $COUNT + 1`
done
  • 4: for循环:
#!/bin/bash

# Author: renshanwen

for loop in 1 2 3 4 5
do
echo "loop的值是 $loop"
done
  • 5: 跳出循环:

  • break
  • comtinue


三: 增强版输出,测试, 输出输入重定向

3.1: 增强版的echo—printf

  • 与C语言格式相同。
renshanwen@A230604-nc01:~$ printf "hello, shell\n"
hello, shell
renshanwen@A230604-nc01:~$

3.2: test命令:


  • 检测某个条件是否成立的。
  • 案例一: 测试两个数是否相等(判断的是值):

num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo 'The two numbers are equal!'
else
echo 'The two numbers are not equal!'
fi
  • ​ ​
  • 案例二: 测试两个字符是否相等。
num1=100
num2=100
if test num1=num2
then
echo 'The two strings are equal!'
else
echo 'The two strings are not equal!'
fi

​ ​

3.3: 输出,输入重定向

  • 命令的输出,输入重定向:

  • ​>​​: 覆盖输出
  • ​>>​​: 追加输出
  • ​<​​: 覆盖输入

四:函数


  • 1: 必须先定义后使用。
  • 2: ​shell函数返回值只可能是个整数, 一般来说0表示成功,其他表示失败​。
  • 3: ​如果需要返回其他类型,需要先定义一个变量, 脚本在需要的时候访问这个变量就可以了​。
  • 4: 案例一: 定义一个函数,然后调用。
#!/bin/bash
# Author: renshanwen
Hello () {
echo "哈哈哈"
}
Hello
  • ​ ​
  • 2: 案例二: 定义一个带有返回值的函数,然后调用。
#!/bin/bash

# Author: renshanwen


funcWithReturn (){
read aNum
read anotherNum
return $(($aNum + $anotherNum))

}

funcWithReturn

res=$?

echo $res
  • ​ ​

  • 注意: 无法返回一个字符串,需要用$()转换为变量。
  • $? 可以取出上一次命令的返回值。

  • 3: 函数的嵌套使用:
#!/bin/bash

# Author: renshanwen


func_one (){
echo "第一个函数"
func_two
}

func_two (){
echo "第二个函数"
}

func_one

  • 4: 函数中获取参数:
func_one (){
echo "第一个参数是 $1"
echo "第二个参数是 $2"
}
func_one aaa bbb

renshanwen@A230604-nc01:~$ ./test.sh
第一个参数是 aaa
第二个参数是 bbb
renshanwen@A230604-nc01:~$