目录
- 2.1:shell提示符(了解):
- 2.2: shell变量:
- 2.3: shell特殊变量:
- 2.4:替换:
- 2.5: 字符串:
- 2.6: 数组:
- 2.7: 运算符:
- 四:函数
- 参考地址: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中的特殊符号:
- 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:替换:
#!/bin/bash
# Author: renshanwen
a=10
echo -e "Value is $a \n"
- 转义字符含义
- 命令替换:
#!/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可以先执行命令,将输出结果暂时保存,在适当的地方输出。
- 变量替换:
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分支循环
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:~$