shell语法总结一(持续补充)

在这里插入图片描述

一、变量

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、语法格式

casein
模式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$ 

在这里插入图片描述

  • 43
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 36
    评论
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码敲到头发茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值