一、变量
1、变量的命名规则
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 _。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
注意,变量名和等号之间不能有空格
ubuntu@VM-24-12-ubuntu:~/20221212$ name= "shell"
Command 'shell' not found, did you mean:
定义变量的时候,值可以带引号,也可以不带引号;
如果后面的值包含空格,需要带引号
ubuntu@VM-24-12-ubuntu:~/20221212$ name=hello shell
Command 'shell' not found, did you mean:
ubuntu@VM-24-12-ubuntu:~/20221212$ name="hello shell"
2、查看变量
echo $变量名
echo ${变量名}
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
ubuntu@VM-24-12-ubuntu:~/20221212$ name="hello shell"
ubuntu@VM-24-12-ubuntu:~/20221212$ echo $name
hello shell
ubuntu@VM-24-12-ubuntu:~/20221212$ echo ${name}
hello shell
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
ubuntu@VM-24-12-ubuntu:~/20221212$ name="kobe"
ubuntu@VM-24-12-ubuntu:~/20221212$ echo "$nameplaying~~~"
~~~
ubuntu@VM-24-12-ubuntu:~/20221212$ echo "${name}playing~~~"
kobeplaying~~~
3、删除命令
unset 变量名
ubuntu@VM-24-12-ubuntu:~/20221212$ a="jm"
ubuntu@VM-24-12-ubuntu:~/20221212$ echo $a
jm
ubuntu@VM-24-12-ubuntu:~/20221212$ unset a
ubuntu@VM-24-12-ubuntu:~/20221212$ echo $a
4、变量的作用域
4.1、局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
4.2、全局变量
在当前shell中任何地方可以使用的变量,并且,还可以在子shell进程中有效的变量,称为全局变量
4.3、环境变量
所有的程序,包括shell启动的程序,都能访问环境变量;
在路径为/etc/profile的文件中编辑的任意变量都是系统环境变量
在路径为~/.bashrc的文件中编辑的任意变量都是用户环境变量
显示当前Shell中所有变量printenv
5、自定义变量
ubuntu@VM-24-12-ubuntu:~$ export TEST=66
ubuntu@VM-24-12-ubuntu:~$ echo $TEST
66
6、只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
ubuntu@VM-24-12-ubuntu:~$ name="kobe"
ubuntu@VM-24-12-ubuntu:~$ readonly name
ubuntu@VM-24-12-ubuntu:~$ unset name
bash: unset: name: cannot unset: readonly variable
二、字符串
1、单引号
变量名=‘变量值’
特点:变量值是什么输出就是什么
ubuntu@VM-24-12-ubuntu:~$ a="today"
ubuntu@VM-24-12-ubuntu:~$ b='$a studing~~'
ubuntu@VM-24-12-ubuntu:~$ echo $b
$a studing~~
2、双引号(用的多)
变量名=“变量值”
ubuntu@VM-24-12-ubuntu:~$ a="today"
ubuntu@VM-24-12-ubuntu:~$ c="$a studing~~"
ubuntu@VM-24-12-ubuntu:~$ echo $c
today studing~~
3、拼接字符串
ubuntu@VM-24-12-ubuntu:~$ a="hello"
ubuntu@VM-24-12-ubuntu:~$ b="$a china"
ubuntu@VM-24-12-ubuntu:~$ echo $b
hello china
4、获取字符串的长度
ubuntu@VM-24-12-ubuntu:~$ a="hello"
ubuntu@VM-24-12-ubuntu:~$ echo ${#a}
5
5、提取子字符串
ubuntu@VM-24-12-ubuntu:~$ a="runoob is a great site"
ubuntu@VM-24-12-ubuntu:~$ echo ${a:1:4}
unoo
三、shell数组
1、定义数组
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 … 值n)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=(
value0
value1
value2
value3
)
注意:数组采用小括号,值与值之间使用空格隔开
还可以单独定义数组的各个分量
数组[0]=value0
数组[1]=value1
2、读取数组
ubuntu@VM-24-12-ubuntu:~$ echo ${array[0]}
0
ubuntu@VM-24-12-ubuntu:~$ echo ${array[1]}
2
ubuntu@VM-24-12-ubuntu:~$ echo ${array[-1]}
5
3、获取数组的长度
ubuntu@VM-24-12-ubuntu:~$ echo ${#array[*]}
5
四、Shell 注释
1、单行注释
以 # 开头的行就是注释,会被解释器忽略。
通过每一行加一个 # 号设置多行注释,
2、多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
五、传递参数(特殊变量)
脚本中命令如下:
#!/bin/bash
echo "shell脚本中传递参数:"
echo "脚本名称:$0"
echo "传递的第一个参数:$1"
echo "传递的第二个参数:$2"
echo "传递的参数个数:$#"
echo "传递的参数有:$@"
echo "传递的参数有:$*"
执行脚本
ubuntu@VM-24-12-ubuntu:~/20221212$ bash test1.sh "value1" "value2"
shell脚本中传递参数:
脚本名称:test1.sh
传递的第一个参数:value1
传递的第二个参数:value2
传递的参数个数:2
传递的参数有:value1 value2
传递的参数有:value1 value2
$0
:代表该脚本名称$1 - $9
代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
$#
:获取当前shell命令行中参数的总个数$?
:获取执行上一个命令的返回值(0:代表成功,非0代表失败)$*
:功能描述:这个变量代表命令行中所有的参数,$*
把所有的参数看成一个整体$@
:功能描述:这个变量也代表命令行中所有的参数,不过$@
把每个参数区分对待
$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。
假设在脚本运行时写了三个参数 1、2、3,
则 " * " 等价于 “1 2 3”(传递了一个参数),
而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
六、基本运算符
算数运算符
关系运算符
布尔运算符
字符串运算符
文件测试运算符
1、算数运算符
加
ubuntu@VM-24-12-ubuntu:~/20221212$ echo $[$a+$b]
14
或者:
ubuntu@VM-24-12-ubuntu:~/20221212$ expr $a + $b
14
减
ubuntu@VM-24-12-ubuntu:~/20221212$ echo $[$a - $b]
-2
乘
ubuntu@VM-24-12-ubuntu:~/20221212$ echo $[$a * $b]
48
除
ubuntu@VM-24-12-ubuntu:~/20221212$ echo $[$a / $b]
0
等于、不等于
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a == $b ];echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a != $b ];echo $?
0
2、关系运算符
-eq 检测两个数是否相等,相等返回 true。
-ne 检测两个数是否不相等,不相等返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
注意:[ 表达式 ] ,表达式与中括号之间一定要有空格
ubuntu@VM-24-12-ubuntu:~/20221212$ echo $a
6
ubuntu@VM-24-12-ubuntu:~/20221212$ echo $b
8
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -eq $b ];echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -ne $b ];echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -lt $b ];echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -gt $b ];echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -ge $b ];echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -le $b ];echo $?
0
3、布尔运算符
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
a=6
b=8
c=0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -lt $b -o $a -gt $c ];echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -lt $b -a $a -gt $c ];echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -nt $b -a $a -gt $c ];echo $?
1
4、逻辑运算符
&&: 表示前一条命令执行成功时,才执行后一条命令;
|| :表示上一条命令执行失败后,才执行下一条命令
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -gt $b ] && echo "成功" || echo "失败"
失败
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $a -lt $b ] && echo "成功" || echo "失败"
成功
5、字符串运算符
= 检测两个字符串是否相等,相等返回 true
。!= 检测两个字符串是否不相等,不相等返回 true
。-z 检测字符串长度是否为0,为0返回 true
。-n 检测字符串长度是否不为 0,不为 0 返回 true
。$ 检测字符串是否不为空,不为空返回 true
。
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $str1 = $str2 ]; echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ $str1 != $str2 ]; echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ -z str1 ]; echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ -n str1 ]; echo $?
0
6、文件测试运算符
-b file 检测文件是否是块设备文件,如果是,则返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。
-d file 检测文件是否是目录,如果是,则返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p file 检测文件是否是有名管道,如果是,则返回 true。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
-r file 检测文件是否可读,如果是,则返回 true。
-w file 检测文件是否可写,如果是,则返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。
ubuntu@VM-24-12-ubuntu:~/20221212$ [ -d ~/20221212/test1.sh ];echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ -f ~/20221212/test1.sh ];echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ -e ~/20221212/test1.sh ];echo $?
0
ubuntu@VM-24-12-ubuntu:~/20221212$ [ -e ~/20221212/test2.sh ];echo $?
1
ubuntu@VM-24-12-ubuntu:~/20221212$ [ -x ~/20221212/test1.sh ];echo $?
1
七、echo命令
用于字符串的输出。命令格式:
echo string
1、显示普通字符串
echo “It is a test”
2、显示换行
ubuntu@VM-24-12-ubuntu:~/20221212$ echo -e "OK! \nOK!"
OK!
OK!
3、显示不换行
#!/bin/bash
echo -e "OK! \c"
echo "It is a test"
ubuntu@VM-24-12-ubuntu:~/20221212$ bash test2.sh
OK! It is a test
4、显示结果定向至文件
ubuntu@VM-24-12-ubuntu:~/20221212$ echo "It is a test" > myfile
5、显示命令执行结果
echo `date`
Tue 13 Dec 2022 03:02:27 PM CST
八、if语句
1、if语句语法格式:
if condition
then
command1
command2
command3
fi
2、if—else语句语法格式:
if condition
then
command1
command2
else
command3
fi
3、if—elif—else 语法格式:
if condition
then
command1
command2
elif condition1
then
command3
command4
else
command5
fi
4、案例
#!/bin/bash
read -p "请输入数字a:" a
read -p "请输入数字b:" b
if [ $a -gt $b ]
then
echo "$a大于$b"
elif [ $a -lt $b ]
then
echo "$a小于$b"
else
echo "$a等于$b"
fi
、
ubuntu@VM-24-12-ubuntu:~/20221212$ bash if.sh
请输入数字a:6
请输入数字b:6
6等于6
ubuntu@VM-24-12-ubuntu:~/20221212$ bash if.sh
请输入数字a:4
请输入数字b:7
4小于7
ubuntu@VM-24-12-ubuntu:~/20221212$ vim if.sh
九、for循环
1、语句格式:
for var in item1 item2 ... itemn
do
command1
command2
...
done
2、案例:顺序输出当前列表中的数字
#!/bin/bash
for loop in 1 2 3 4 5
do
echo "value:$loop"
done
ubuntu@VM-24-12-ubuntu:~/20221212$ bash for.sh
value:1
value:2
value:3
value:4
value:5
3、案例:顺序输出字符串中的字符
for loop in this is a string
do
echo "value:$loop"
done
ubuntu@VM-24-12-ubuntu:~/20221212$ bash for.sh
value:this
value:is
value:a
value:string
十、while循环
1、语法格式为:
while condition
do
command
done
2、案例:输入一个数,计算1到这个数的和
#!/bin/bash
s=0
i=1
read -p "请输入数字:" num
while [ $i -le $num ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
ubuntu@VM-24-12-ubuntu:~/20221212$ bash while.sh
请输入数字:100
5050
3、无限循环格式
while true
do
command
done
十一、case语句
case … esac 为多选择语句,与其他语言中的 switch … case 语句类似,是一种多分支选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case … esac 语句,esac(就是 case 反过来)作为结束标记。
可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
1、语法格式
case 值 in
模式1)
command1
command2
...
;;
模式2)
command1
command2
...
;;
esac
2、案例
#!/bin/bash
echo "请输入数字:"
read num
case $num in
1)
echo "你选择了1"
;;
2)
echo "你选择了2"
;;
3)
echo "你选择了3"
;;
4)
echo "你选择了4"
;;
*)
echo "输入错误"
;;
esac
ubuntu@VM-24-12-ubuntu:~/20221212$ bash case.sh
请输入数字:
12
输入错误
ubuntu@VM-24-12-ubuntu:~/20221212$ bash case.sh
请输入数字:
5^H
输入错误
ubuntu@VM-24-12-ubuntu:~/20221212$ bash case.sh
请输入数字:
1
你选择了1
3、跳出循环:break
#!/bin/bash
while :
do
echo -n "请输入1-5之间的数字:"
read number
case $number in
1|2|3|4|5)
echo "你输入的数字为$number"
;;
*)
echo "你输入的数字不是1-5之间的数字"
break
;;
esac
done
ubuntu@VM-24-12-ubuntu:~/20221212$ bash break.sh
请输入1-5之间的数字:2
你输入的数字为2
请输入1-5之间的数字:7
你输入的数字不是1-5之间的数字
ubuntu@VM-24-12-ubuntu:~/20221212$