自学shell编程——第1讲(基础概念、变量、符号、字符串处理、列表)
自学shell编程——第1讲(基础概念、变量、符号、字符串处理、列表)
1. 常见shell命令
ls cd more less pwd mkdir clear touch vim chmod grep cp ln mv man ps -ef
查看这些命令的帮助文档:man less或less --help
2. shell编程和C语言编程的差距
C语言:①文本编辑器编辑文件hello.c;②进行编译:gcc hello.c -o hello.o,则该目录下会生成一个可执行的hello.o文件;③执行:./hello.o
shell编程:①文本编辑器编辑文件hello.sh;②不需要编译,但需要修改执行权限:chmod 777 ./hello.sh;③执行:./hello.sh
3. shell文件的基础知识
- *.sh文件第一行#/bin/bash,指明bash解析器的路径
- *.sh文件命名可以包括数据、字母、下划线,且都可以作为开头
- *.sh文件是按行依次执行,并不存在主函数
- 没有printf输出语句,使用echo输入到终端或文件
- echo -e “hello\nword!” ===> 识别换行符,输出两行
- echo -e “hello\tword!” ===> 识别Tab键,输出hello world
4. shell变量的定义与使用
- 变量的命名:可以包括数据、字母、下划线,但是数字不能作为开头,其它两者可以
- 变量不需要声明数据类型,全部默认字符串类型
- 变量的赋值,等号的两边不需要出现空格。str=hello
- 变量的引用,在变量前加上$符号
- 变量的种类:①用户自定义变量;
②命令行变量:** 这里强调,一个良好的书写习惯。只要你使用了命令行传参,那么你就在shell脚本的最开头,做一个判断参数数量的判断。**
a. $#:用于识别外部/命令行传参的个数;
b. $*:命令行所有参数,作为一个字符串;
c. $1、$2、$3……:代表依次传入的参数内容;
d. $?:代表 ** 上一条 ** shell语句的执行结果返回值(成功0;失败非0数)。
#!/bin/bash
touch file.txt
test -e file.txt #判断file.txt是否存在,因为前面新建了,所以存在
echo "$?" #输出上一条语句的返回值0
test -e newfile.txt #判断newfile.txt是否存在,因为前面没有新建了,所以不存在
echo "$?" #输出上一条语句的返回值1
#执行:会输出两个数字,先0后1。
5. shell的符号
- 双引号(" “)作用:将某些对象变成字符串输出。三种情况:
①字符串中存在空格,使用双引号。a=“hello world”
②当双引号中存在变量时。b=”$str 123"
③当双引号中为shell命令时,即对命令的结果进行操作时,需要与反引号共用。
echo " `ls -l ` "
- 单引号(’ ')作用:把包裹的内容当做字符串使用
echo " day is ` date ` " #输出为:day is Sun Dec 14th 2020……
echo ' day is `date` ' #输出为:day is `date`
- 反引号作用:对双引号中的shell命令进行识别并执行 #### 因为反引号在markdown中有含义,所以反引号比较难输入
- 重定向符(>):覆盖文件内容;(>>):追加内容至文件中
6. 字符串处理
建议:这是一个编程语言,重要是使用,有些地方理解不了,我就放过了。
计算字符串长度${#str}
str="hello world"
length=${#str};echo $length #输出字符串长度为11
这里将加一个知识点。通配符————以后的正则表达式学习基础
- *:代表任意长度的任意字符
- ?:代表长度为1的任意字符
- [a-z]:代表a到z的任意1个字符
- [az]:代表a或z的任意1个字符
- [ ^az]:代表a和z除外的任意1个字符(注:这里 ^前面没有空格,markdown的 ^有含义)
- %:代表从右到左尽可能少的匹配
- %%:代表从右到左尽可能多的匹配
- #:代表从左到右尽可能少的匹配
- ##:代表从左到右尽可能多的匹配
这里的多和少的匹配指匹配到的字符串长度,要好好理解
字符串合并
直接连起来写,不需要任何连接。如果中间要加空格、下划线、加号(+)、减号(-)等字符,则需要双引号;若直接使用,则会报错
str1=hello;str2=world
str=$str1$str2 #输出str为helloworld
str=$str1" "$str2 #输出str为hello world
str=$str1"_"$str2 #输出str为hello_world
str=$str1 $str2 #报错:not found command
字符串删除。包括删除一定长度或者一定匹配条件下删除
使用前面提到的通配符。重点是理解下面的例子。
str="123111abcaaabhelloworldbcccba321"
#从左到右删除,删除前面所有数字,观察需要删除123111,则1是最后一个数字,但是只用1卡,发现不对。所以我们同时用两个卡
echo ${str#*1} #输出23111abcaaabhelloworldbcccba321
echo ${str##*1} #尽可能匹配多的*1,发现全部就删除了
echo ${str##*11} #输出abcaaabhelloworldbcccba321
#从右到左删除
echo ${str%3*} #输出123111abcaaabhelloworldbcccba
echo ${str%%3*} #输出12
#保留helloworld,先左删后右删
str1=${str##*ab} #str1=helloworldbcccba321
str2=${str1%%b*};echo $str2 #str2=helloworld
7. 列表
shell脚本中创建列表
list1=(A B C D) #用空格间隔即可,变量不需要引号
for element in ${list1[@]}
do
echo ${element}
done