一、概述:
1.1、简介:
shell是用C语言编写的程序,它是用户使用 Linux 的桥梁。Shell既是一种命令语言,又是一种程序设计语言。linux中的shell就是linux内核的一个外层保护工具,并负责完成用户与内核之间的交互。
1.2、常用shell:
-
Bourne Shell(/usr/bin/sh或/bin/sh)
-
Bourne Again Shell(/bin/bash)
-
C Shell(/usr/bin/csh)
-
K Shell(/usr/bin/ksh)
-
Shell for Root(/sbin/sh)
……
1.3、shell编写注意事项:
-
shell命名:shell脚本名称一般为英文大小写,不能以特殊符号、空格开头(名称要一眼看出功能);
-
shell编程首行需要以
#!/bin/bash
开头开头; -
脚本中变量不能以数字、特殊符号开头,可以使用下划线“__”,不能使用“-”。
二、变量:
2.1、变量详解:
shell编程中变量分为三种,分别是系统变量、环境变量、用户变量。
2.1.1、系统变量:
又称shell变量,主要用于对参数判断和命令返回值判断时使用,shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
2.1.2、环境变量:
主要是在程序运行时需要设置,所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
2.1.3、用户变量:
又称局部变量,局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2.2、变量操作:
2.2.1、命令变量:
shell编程中,定义变量是直接定义的,没有明确的数据类型,shel允许用户建立变量存储数据,但是将认为赋给变量的值都解释为一串字符。
2.2.2、变量操作:
-
普通变量:
name="tes"
,等号两边不能有空格; -
局部变量:
local name="test"
,使用local修饰的变量在函数体外无法访问,只能在函数中使用; -
只读变量:
name="only_read" -> readonly name
; -
使用变量:
echo $name或echo ${name}
,shell中”$“用于取变量值,对于较长的变量名,通常加上”{}“,帮助解释器识别变量边界; -
删除变量:
unset name
,删除之后的变量无法被访问,只读变量无法删除。
三、shell字符串:
3.1、字符串创建:
在shell中字符串时shell编程中最常用最有勇的数据类型,字符串的创建可以用单引号,双引号,也可以不用引号。
3.1.1、单引号创建:
单引号里的任何字符都会原样输出,单引号字符串中的变量时无效的;
不能出现单独意哥的单引号,无法转义和使用转义符。
3.1.2、双引号创建:
可以在双引号中使用变量 、转义字符。
3.2、字符串拼接:
3.2.1、字面拼接:
字符串a和b拼接:str=”a“”b“
或str=‘a’‘b’
,需要注字符串之间不能有空格。
3.2.2、变量拼接:
字符串变量part01和part02拼接str=${part01}${part02}
或str="${part01}${part02}"
或str=${part01}"end"
(变量part01和字符串end拼接)。
3.2.3、命令拼接:
str='data'"end"
,其中的data是一个shell命令,需要使用引用。
3.3、获取字符串长度:
3.3.1、wc -L
:
wc -L
可以获取当前行的长度,因此对于单独行的字符串可以用这个简单的方法获取,另外wc -l
则是获取当前字符串内容的行数。
3.3.2、expr lenth
:
3.3.3、awk
获取域的个数:
若大于10个字符的长度时是否存在问题需要后期确认
3.3.4、awk+length
获取字符串长度:
3.3.5、使用" # "符号对字符串进行取值echo ${#name}
:
示例:
#!/bin/bash
str1=yang
str2=lei
str3="str1""str2"
str4=${str1}${str2}
str5=${str1}"end"
str6="${str1}${str2}"
str7=abcdefghijklmn
echo $str3 $str4 $str5 $str6
echo $str5 |wc -L
expr length ${str1}
echo "abc" |awk -F "" '{print NF}'
echo ${#str7}
3.4、字符串的提取:
-
#
号截取,删除左边字符,保留右边字符(包括为基准的字符); -
##
号截取,删除左边字符,保留右边字符; -
%
号截取,删除右边字符,保留左边字符; -
%%
号截取,删除右边字符,保留左边字符; -
:x:y
从左边第几个字符开始,及字符的个数,其中的x表示左边第一个字符开始,y 表示字符的总个数。 -
:x
从左边第几个字符开始,一直到结束,其中的 x 表示左边第x+1个字符开始,一直到结束。 -
:0-x:y
从右边第几个字符开始,及字符的个数,其中的 0-x 表示右边算起第x个字符开始,y 表示字符的个数。 -
:0-x
从右边第几个字符开始,一直到结束,表示从右边第x个字符开始,一直到结束。
代码 | 含义 |
---|---|
${var##*string} | 从左向右截取最后一个string后的字符串 |
${var#*string} | 从左向右截取第一个string后的字符串 |
${var%%string*} | 从右向左截取最后一个string后的字符串 |
${var%string*} | 从右向左截取第一个string后的字符串 |