什么是Shell?
Shell是由C语言编写的一个命令解释器,他接收用户/应用程序的命令,调用操作系统内核。
或者我们也可以把Shell看成一个功能比较强大的编程语言。
Shell的解析器(了解)
每个操作系统的解析器都不太一致,在终端输入
cat /etc/shells
下面是我的Ubuntu系统输出的Shell解析器:
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
查看系统的默认解析器:
echo $SHELL
/bin/bash
编写简单的Shell脚本
shell脚本的文件以.sh为后缀,例如: xxx.sh
那么,我们如何开始编写一个我们自己的shell脚本呢?
vim helloworld.sh
通过vi / vim指令,生成我们的.sh文件,接下来,我们就可以在这个文件里编写我们的shell脚本了。
单击键盘“i”键,在文件上执行插入操作,接下来我们输入:
#! /bin/bash
echo 'Hello World'
开头的#! 后面指定了我们要用到的解析器,默认是bash,echo输出后面的语句。
接下来我们单击“ESC”键退出插入模式,再按住"shift"输入“:”并输入“wq”退出vim模式。
这样,我们的一个简单的bash脚本就写好了。
但是,这时候我们刚写完的bash脚本时没有执行权限的
我们可以输入ll指令进行查看:
-rw-r--r-- 1 root root 33 Sep 27 16:43 helloworld.sh
输入:
chmod a+x helloworld.sh
给我们的shell脚本加上权限。
这时候可以直接执行我们的脚本了:
./helloworld.sh
root@edge:~# ./helloworld.sh
Hello World
或者我们可以使用其他方式来执行我们的shell脚本(适用于无执行权限):
sh ./helloworld.sh
(or)
bash ./helloworld.sh
(or)
source ./helloworld.sh
拓展:
直接使用绝对路径以及sh,bash的方法执行,都是新开一个进程去执行shell脚本。
source是在当前进程直接执行shell脚本。
Shell变量
命名规则和其他语言类似,此处省略。
变量类型分为局部变量,环境变量以及shell变量,前二者和其他语言类似,shell变量是shell程序设置的特殊变量,其中一部分是局部变量,一部分是环境变量。
注:shell脚本中不可以随意加空格,name=“shell”若改成name = “shell”则无效。
#变量的声明【1】
name="shell"
for file in `ls /etc`
(or)
for file in $(ls /etc)
#变量的调用
echo $name
echo ${name}
echo “my name is ${name}”
#只读变量的声明
url="https://www.baidu.com"
readonly url
#删除变量
unset name
#注:只读变量无法用unset删除
注【1】:
此处可以有多种声明的方式,其他的声明方式如下:
name='shell'
name=shell
但如果是要赋值shell test,这种带空格的形式,则需要带上引号
name="shell test"
name='shell test'
其中单双引号的区别在于,双引号可以进行转义
假设我们有:
str1="test"
str2="$str1 test2"
此时echo $str2的结果为:test test2
str3='$str1 test2'
此时echo $str3的结果为:$str1 test2
综上所述,建议不含空格的字符串直接不带引号声明,含空格的字符串用双引号声明。
或者直接暴力应用,所有字符串都使用双引号声明。
拓展:
可以使用#查询字符串的长度
例如上面的str2, 我们输入echo ${#str2},输出结果为10。
使用下面的方式对字符串进行截取:
echo ${str2:2:5},从该字符串的第二位开始往后截取五个字符。
Shell数组
bash脚本只支持一位数组,不支持多维数组(我不理解.jpg),没有限定数组的大小。
数组元素的下标和其他语言一样,从0开始。
#定义数组
array=("唱" "跳" "rap" "篮球" "music")
#此处的空格很好的解释了上文定义变量的时候等号两边不能使用空格,因为空格在shell中起到了分隔符的作用。
#读取数组某一元素
echo ${array[3]}
#读取数组所有元素
echo ${array[@]}
echo ${array[*]}
#获取数组长度
echo ${#array[@]}
echo ${#array[*]}
Shell的注释
shell脚本使用#作为单行注释,而非经典的//。
shell脚本中的多行注释比较特殊,要使用下面这种形式:
:<<[tag]
注释内容...
注释内容...
[tag]
其中的[tag]是需要我们自己去给他起名字的,例如:
:<<note
This note is merely for the fresh learner.
Feed me back if you find anything wrong.
note
我们可以在我们先前创建的helloworld.sh脚本里进行实践:
wq退出保存,运行结果为:
是的,他并没有对我们的脚本文件产生任何影响。