前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >技术栈系列基础篇1-shell

技术栈系列基础篇1-shell

原创
作者头像
AndreKzWu
修改2022-09-21 17:14:10
6360
修改2022-09-21 17:14:10
举报
文章被收录于专栏:AndrekzWu的专栏

一、简介

1.1、 什么是shell

  • Shell是用C语言编写的程序
  • Shell是一种应用程序,该应用程序提供一个界面,用户通过界面访问linux

1.2、Shell脚本

Shell 脚本,是Shell编写的脚本程序,后缀名为 .sh

1.3、Shell环境

Shell 常见的编辑器种类如下:

  • sh - 即Bourne Shell,sh 是 Unix标准默认的shell
  • bash - 即Bourne Again Shell。bash是Linux标准默认的shell
  • zsh - 功能强大的 shell 与脚本语言

shell脚本定脚本解释器

  • 指定sh 解释器,unix标准默认#!/bin/sh#!/bin/bash
  • 指定bash解释器,linux标准默认

1.4、模式

Shell 有交互和非交互模式

交互模式

代码语言:txt
复制
shell交互模式为用户在界面执行命令行
例如:
➜  ~ ls -l

非交互模式

代码语言:txt
复制
shell的非交互模式为执行shell脚本
例如:
➜  bat git:(master) sh andreserver_lanproxy_login.sh

二、基本语法

2.1、解释器

在shell脚本中,#! 描述该shell脚本所使用的解释器,详见1.3 例如:

代码语言:txt
复制
#!/bin/sh 或 #!/bin/bash

2.2、注释

shell脚本的语法中,注释方式有以下两种

  • 单行注释,用 # 开头,例如 # 这是一行shell注释
  • 多行注释,用:<<EOF开头,EOF结束,例如
代码语言:txt
复制
代码语言:txt
复制
:<<EOF
代码语言:txt
复制
这是多行shell注释
代码语言:txt
复制
EOF
代码语言:txt
复制

2.3、字符串输出

echo用于字符串输出

代码语言:txt
复制
echo "hello,world"

printf用于格式化输出

代码语言:txt
复制
printf "$d %s" 1 "hello"
# output: 1 hello

2.4、双引号""、单引号''、反引号

<font color=blue>双引号""、单引号''、反引号 的区别</font>

双引号"": 可识别转义和变量,对变量和转义进行扩展平铺

单引号'': 不识别转义和变量,原样输出

反引号``: 用于执行命令,作用和$(命令)相似

三、变量

3.1、变量命名

  • 只能使用英文字母、数字、下划线,首字母不能是数字
  • 赋值 = 前后不能有空格
  • 不能使用bash的关键字

3.2、声明变量

<font color=red> 访问变量的语法为 ${var} 和 $var,大括号是用来识别变量边界,可加可不加,建议加上</font>

例如:

代码语言:txt
复制
name="andrekzwu"
echo "${name}"
# output: andrekzwu

3.3、只读变量

设置只读变量语法为: readonly 变量

例如:

代码语言:txt
复制
name="andrekzwu"
echo ${name}
readonly name
# name="wukezheng" 执行会报错,例如:test.sh: line 6: name: readonly variable

3.4、删除变量

删除变量的语法为:unset 变量

例如:

代码语言:txt
复制
name="wukezheng"
echo "${name}"
# output: wukezheng
unset name # 删除了变量

3.5、变量类型

  • 局部变量,局部变量只在某个脚本内部有效,不能被其他程序和脚本访问
  • 环境变量,环境变量是当前shell会话内的所有程序和脚本都可访问的变量,使用 export关键字可以设置为环境变量

常见环境变量

  • $HOME,用户目录
  • $PATH,系统路径,用分号分隔的目录列表,shell会从这些目录中找到路径
  • $PWD,当前工作目录
  • $UID,当前用户ID

四、运算符

<font color=red>执行命令时,命名、变量、符号之间需要空格隔离</font>

例如,执行整数运算:

代码语言:txt
复制
expr $x + $y

例如执行if命令

代码语言:txt
复制
if [ $x -ne $y ]; then
echo "${x}不等于${y}"
fi

4.1、算术运算符

算术运算符,例如 变量x 为10,变量y为20:

expr 对整数进行运算

运算符

说明

举例

加法

expr $x + $y 结果为30

减法

expr $x - $y 结果为-10

乘法

expr $x * $y 结果为200

/

除法

expr $y / $x 结果为2

%

取余

expr $y % $x 结果为0

=

赋值

x=$y,将y的结果赋值给x, 注意赋值符号前后不能有空格

==

相等,比较两个数字,相等返回true

[ $x == $y ] 返回false

!=

不相等,比较两个数字,不同则返回true

[ $x != $y ] 返回true

4.2、关系运算符

<font color=blue>关系运算符只支持数字,不支持字符串,除非字符串的值是数字</font>

关系运算符,例如 变量 x为10,变量y为20

运算符

说明

举例

-eq

检测两个数是否相等,相等返回true

[ $x -eq $y ] 返回false

-ne

检测两个数是否不相等,不相等返回true

[ $x -ne $y ] 返回true

-gt

检测左边的数是否大于右边的数,如果是,返回true

[ $x -gt $y ] 返回false

-lt

检测左边的数是否小于右边的数,如果是,返回true

[ $x -lt $y ] 返回true

-ge

检测左边的数是否大于等于右边的数,如果是,返回true

[ $x -ge $y ] 返回false

-le

检测左边的数是否小于等于右边的数,如果是,返回true

[ $x -le $y ] 返回true

4.3、布尔运算符

布尔运算符,例如 变量 x为10,变量y为20

运算符

说明

举例

非运算,表达式为true,则返回false,反之则返回true

[ ! false ] 返回true

-o

或运算,有一个表达式为true,则返回true

[ $x -lt 20 -o $y -gt 100 ] 返回true

-a

与运算,两个表达式都为true才返回true

[ $x -lt 20 -a $y -eq 20 ] 返回true

4.4、逻辑运算符

逻辑运算符,例如 变量 x为10,变量y为20

运算符

说明

举例

&&

逻辑与

[ $x -lt 20 && $y -eq 20 ] 返回true

||

逻辑或

[ $x -lt 20 or $y -gt 100 ] 返回true

4.5、字符串运算符

字符串运算符,例如变量 x为"abc",y为"ABC"

运算符

说明

举例

=

检测两个字符串是否相等,相等返回true

[ $x = $y ] 返回false

!=

检测两个字符串是否相等,不相等返回true

[ $x != $y ] 返回true

-z

检测字符串长度是否为0 ,为0返回true

[ -z $x ] 返回false

-n

检测字符串长度是否为0,不为0返回true

[ -n $x ] 返回true

str

检测字符串是否为空,不为空则返回true

[ $x ] 返回true

4.6、文件测试运算符

运算符

说明

举例

-b file

检测文件是否是块设备文件,如果是,返回true

[ -b $file ] 返回flase

-d file

检测文件是否是目录,如果是,返回true

[ -d $file ] 返回true

-f file

检测文件是否是普通文件,如果是,返回true

[ -f $file ] 返回true

-r file

检测文件是否可读,如果是,返回true

[ -r $file ] 返回true

-w file

检测文件是否可写,如果是,返回true

[ -w $file ] 返回true

-x file

检测文件是否可执行,如果是,返回true

[ -x $file ] 返回true

-s file

检测文件是否为空(文件大小是否大于0),不为空,则返回true

[ -s $file ] 返回true

-e file

检测问价(包括目录)是否存在,如果是,则返回true

[ -e $file ] 返回true

五、控制语句

5.1、条件语句

格式 :

代码语言:txt
复制
# if语句
if [ $x -eq $y ]; then
		echo "$x 等于 $y"
fi

# if else 语句
if [ $x -eq $y ]; then
		echo "$x 等于 $y"
else 
		echo "$x 不等于 $y"
fi

# if elif 语句
if [ $x -eq $y ]; then
		echo "$x 等于 $y"
elif [ $x -ne $y ]; then
		echo "$x 不等于 $y"
fi

5.2、循环语句

格式:for 循环

代码语言:txt
复制
# for 循环1
for arg in elem1 elem2 .....elemN 
do
  ### 语句
done

# 例如遍历文件
for file in $(ls);do
  echo $file
done

# for 循环2
for (( i = 0; i < 10; i++ )); do
	echo $i
done

六、函数

函数定义语法:

代码语言:txt
复制
[ function ] funname [()] {
    action;
    [return int;]
}
  • 函数定义时,function 关键字可有可无。
  • 函数返回值 - return 返回函数返回值,返回值类型只能为整数(0-255)。如果不加 return 语句,shell 默认将以最后一条命令的运行结果,作为函数返回值。
  • 函数返回值在调用该函数后通过 $? 来获得。
  • 所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至 shell 解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

七、参数/流

位置参数变量表:

变量

描述

$0

脚本名

$1 ... $9

第1个到第9个参数列表

${10} ... ${N}

第10个到第N个参数列表

$* or $@

不包括$0在内的所有参数

$#

不包括$0在内的参数个数

$FUNCNAME

函数名称(仅在函数内部有值)

函数处理参数:

另外,还有几个特殊字符用来处理参数:

参数处理

说明

$#

返回参数个数

$* 或$@

返回所有参数

脚本运行的当前进程ID

$!

后台运行的最后一个进程的ID

$?

函数返回值

输出、输出流:

代码

描述符

描述

0

stdin

标准输入

1

stdout

标准输出

2

stderr

标准错误输出

重定向:

operator

desc

重定向输出,以覆盖的方式重定向

&>

重定向输出和错误输出

&>>

以追加的形式重定向输出和错误输出

<

重定向输入,以覆盖的方式重定向

/dev/null文件

/dev/null - 接受并丢弃所有输入; 不产生输出(总是在读取时返回文件结束指示

代码语言:txt
复制
$ command > /dev/null

如果希望屏蔽 stdout 和 stderr,可以这样写:

代码语言:txt
复制
$ command > /dev/null 2>&1

若命令执行错误,标准错误输出也给出打印,若想要将标准错误输出不在屏幕输出,则需要使用重定向技术,将标准错误输出重定向到标准输出2>&1

2>&1 <font color=red>&是用来告诉系统,1这里指的是标准输出,而不是文件。</font>

参考文档:https://juejin.cn/post/6844903784158593038#heading-47

参考文档:https://blog.csdn.net/c_base_jin/article/details/87894722

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简介
    • 1.1、 什么是shell
      • 1.2、Shell脚本
        • 1.3、Shell环境
          • 1.4、模式
          • 二、基本语法
            • 2.1、解释器
              • 2.2、注释
                • 2.3、字符串输出
                  • 2.4、双引号""、单引号''、反引号
                  • 三、变量
                    • 3.1、变量命名
                      • 3.2、声明变量
                        • 3.3、只读变量
                          • 3.4、删除变量
                            • 3.5、变量类型
                            • 四、运算符
                              • 4.1、算术运算符
                                • 4.2、关系运算符
                                  • 4.3、布尔运算符
                                    • 4.4、逻辑运算符
                                      • 4.5、字符串运算符
                                        • 4.6、文件测试运算符
                                        • 五、控制语句
                                          • 5.1、条件语句
                                            • 5.2、循环语句
                                            • 六、函数
                                            • 七、参数/流
                                            领券
                                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档