51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Shell小笔记(一)

格式 {#格式}

打开文本编辑器(如vi或vim ),创建一个后缀名为 sh 的文件;开头第一行提示Shell使用的解释器类型,如 #!/bin/bash ,为保证解析正确建议写上。

例如编写一个名为 test.sh 的脚本:

|-------------|---------------------------------------------------| | 1 2 | #!/bin/bash echo "test" #echo命令用于输出(打印)信息 |

使用方式 {#使用方式}

bashsh + 脚本名运行 {#bash或sh-脚本名运行}

|---------------------|---------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 | [kaka@localhost ~]$ cat test.sh a= 'hello world' echo $a [kaka@localhost ~]$ bash test.sh hello world |

给执行权限后直接运行 {#给执行权限后直接运行}

直接运行前需要为脚本赋予执行权限( chmod +x <脚本的文件名>

|------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 | [kaka@localhost ~]$ cat test.sh a= 'hello world' echo $a [kaka@localhost ~]$ ./test.sh bash: ./test.sh: 权限不够 [kaka@localhost ~]$ chmod +x test.sh [kaka@localhost ~]$ ./test.sh hello world |

使用 source. 运行 {#使用-source-或-运行}

使用 source 相当于在当前终端运行该脚本,可以看到被赋值的变量显示在当前终端上。

|---------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 12 13 | [kaka@localhost ~]$ cat a.sh #!/bin/bash A=5 echo $A [kaka@localhost ~]$ bash a.sh 5 [kaka@localhost ~]$ echo $A [kaka@localhost ~]$ source a.sh 5 [kaka@localhost ~]$ echo $A 5 |

变量 {#变量}

自定义变量、环境变量、位置变量、预定义变量

变量名要求

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
  • 中间不能有空格,可以使用下划线 _
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用help命令查看保留关键字)

如何使用

在变量名前加美元符号( $ )即可

为了帮助解释器识别到变量的边界,可以在变量名外加入花括号( {}

自定义变量 {#自定义变量}

相当于局部变量,仅在当前会话中生效

格式: <变量名>=<变量值> ,注意 等号两边不需要空格

如果变量值存在空格,需要用双引号( "" )或单引号( '' )框起来

使用 unset <变量名> 撤销该自定义变量

环境变量 {#环境变量}

相当于全局变量,在所有会话中生效

例如 /etc/profile 文件存储着当前系统的环境变量

预定义变量 {#预定义变量}

也称为特殊变量;这其中一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

| 变量 | 含义 | |:---:|:----------------------------------------------------------------------------:| | $n | 位置变量 n 为数字, $0 代表该脚本名称 $1 代表第1个参数(以此类推),但从第十个开始要用花括号( {} )包含 | | $# | 获取所有输入参数的个数 | | $* | 获取命令行的所有参数,并将其 视为一个整体 | | $@ | 获取命令行的所有参数,但 将每个参数进行拆分 | | $? | 获取最后一次命令执行的状态,正确执行为 0 ,其余输出则不正常 |

创建一个名为 advance.sh 的文件,并写入以下内容

|---------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # !/bin/bash echo '==========$n==========' echo $0 echo $1 echo $2 echo '==========$#==========' echo $# echo '==========$*==========' for i in "$*"; do echo $i done echo '==========$@==========' for i in "$@"; do echo $i done echo '==========$?==========' echo $? |

使用 . advance.sh 1 2 3 4 5 命令,结果如下

|------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ==========$n========== ./advance.sh 1 2 ==========$#========== 5 ==========$*========== 1 2 3 4 5 ==========$@========== 1 2 3 4 5 ==========$?========== 0 |

只读变量 {#只读变量}

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变、不能被撤销

赋值 {#赋值}

  • 显示 变量的值 使用 双引号

  • 单引号 中是 没有变量

  • 反引号(``)等价于 $() , 反引号的Shell命令会被先执行

直接赋值 {#直接赋值}

格式: <变量名>=<变量值> ,注意 等号两边不需要空格

|---------------|------------------------------------------------| | 1 2 3 | # !/bin/bash num=10086 #直接赋值 echo $num |

键盘读取赋值 {#键盘读取赋值}

格式: read -p ["提示信息"] [变量名] ,可不带 -p ["提示信息"] 这个选项和参数

获取输入的单行数据,并赋值给变量名

|---------------|--------------------------------------------------------------------| | 1 2 3 | # !/bin/bash read INPUT #将键盘输入的单行数据赋值给INPUT变量名 echo $INPUT |

通过命令行参数赋值 {#通过命令行参数赋值}

即通过 位置变量 进行调用

|-------------|---------------------------------| | 1 2 | # !/bin/bash echo $1 $2 |

利用命令的输出结果赋值 {#利用命令的输出结果赋值}

在赋值语句中使用反向单引号( ``)

|---------------|------------------------------------------------------------------------| | 1 2 3 | # !/bin/bash DATE=`date +%F` #将当前年月日期(结果)赋值到DATE变量上 echo $DATE |

其中 date +%F 等价于 $(date +%F)

从文件中读取数据赋值 {#从文件中读取数据赋值}

这种方式适用于处理大批量的数据,直接把相应的数据写入文件中。这种方式通常是循环一行行读入数据,即每循环一次,就从文件中读入一行数据,知道文件的结尾。

|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 | # !/bin/bash ls *.sh > execfile #列举后缀名为sh的文件重定向至execfile while read LINE #使用While循环读取每一行,并赋值到LINE这个变量中 do echo $LINE #输出每行内容 done < execfile |

运算符 {#运算符}

在bash中,变量的默认均为 字符串 类型,无法直接进行运算

基本语法 {#基本语法}

"$((运算式))""$[运算式]"

|-------------------|----------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 | [kaka@localhost ~]$ a=10 [kaka@localhost ~]$ b=20 [kaka@localhost ~]$ sum =$(( $a + $b )) #或 sum=$[$a+$b] [kaka@localhost ~]$ echo $sum 30 |

使用expr计算 {#使用expr计算}

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

|-----------------|-----------------------------------------------------------------------------------------------| | 1 2 3 4 | [kaka@localhost ~]$ a=10 [kaka@localhost ~]$ b=20 [kaka@localhost ~]$ expr $a + $b 30 |

使用let计算 {#使用let计算}

|-------------------|-----------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 | [kaka@localhost ~]$ a=10 [kaka@localhost ~]$ b=20 [kaka@localhost ~]$ let sum =a+b [kaka@localhost ~]$ echo $sum 30 |

算数运算符 {#算数运算符}

| 运算符 | 说明 | 举例 | |:---:|:------------------------:|:----------------------------------:| | + | 加法 | expr $a + $b | | - | 减法 | expr $a - $b | | * | 乘法 | expr $a \* $b 此处需要用 \ 以防转译 | | / | 除法 | expr $b / $a | | % | 取余 | expr $b % $a | | = | 赋值 | a=$b 把变量 b 的值赋给 a | | == | 相等 用于比较两个数字,相同则返回 true | [$a == $b] | | != | 不相等 用于比较两个数字,不相同则返回 true | [$a != $b] |

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [$a == $b]

替删改 {#替删改}

替换 {#替换}

| 语法 | 含义 | |:-----------------:|:---------------:| | ${变量名/旧字符串/新字符串} | 将第一个旧字符串替换成新字符串 | | ${变量名//旧字符串/新字符串} | 将全部的旧字符串替换成新字符串 |

例如将 www.abc.com 中的第一个 a 替换成 d

|-------------|------------------------------------------| | 1 2 | var=www.abca.com echo ${var/a/d} |

例如将 114514 中的 1 全部替换成 9

|-------------|-------------------------------------| | 1 2 | num=114514 echo ${num//1/9} |

删除 {#删除}

| 语法 | 含义 | |:--------------------------:|:-----------------------:| | ${ 变量名 # 关键字符 } | 删除第一个关键字符前面的内容(从前往后匹配) | | $[ 变量名 ## 关键字符 ] | 删除最后一个关键字符前面的内容(从前往后匹配) | | $[ 变量名 % 关键字符 ] | 删除第一个关键字符后面的内容(从后往前匹配) | | $[ 变量名 %% 关键字符 ] | 删除最后一个关键字符后面的内容(从后往前匹配) |

创建一个名为 del.sh 的文件,并写入以下内容

|------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | file=/dir1/dir2/abc.file echo "输出名为file变量" echo ${file} echo '删除第一个 / 前面的内容(从前往后匹配)' echo ${file#*/} echo "删除最后一个 / 前面的内容(从前往后匹配)" echo ${file##*/} echo "删除第一个 / 后面的内容(从后往前匹配)" echo ${file%/*} echo "删除最后一个 / 后面的内容(从后往前匹配)" echo ${file%%/*} |

执行结果

|---------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 7 8 9 | 输出名为file变量 /dir1/dir2/abc.file 删除第一个 / 前面的内容(从前往后匹配) dir1/dir2/abc.file 删除最后一个 / 前面的内容(从前往后匹配) abc.file 删除第一个 / 后面的内容(从后往前匹配) /dir1/dir2 删除最后一个 / 后面的内容(从后往前匹配) |

修改 {#修改}

使用 ${变量名-新的变量名} 进行替换

|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------| | 1 2 3 4 5 6 | [kaka@localhost ~]$ unset num [kaka@localhost ~]$ echo ${num-1919} 1919 [kaka@localhost ~]$ num=10010 [kaka@localhost ~]$ echo ${num-1919} 10010 |

赞(0)
未经允许不得转载:工具盒子 » Shell小笔记(一)