1、shell介绍

shell 俗称叫做壳,计算机的壳层,和内核是相对的,用于和用户交互,接收用户指令,调用相应的程序。

因此,把shell分为2大类

1.1、图形界面shell(Graphical User Interface shell 即 GUI shell)

也就是用户使用GUI和计算机核交互的shell,比如Windows下使用最广泛的Windows Explorer(Windows资源管理器),Linux下的X Window,以及各种更强大的CDE、GNOME、KDE、 XFCE。

他们都是GUI Shell。

1.2、命令行式shell(Command Line Interface shelljs切割字符串,即CLI shell)

也就是通过命令行和计算机交互的shell。 Windows NT 系统下有 cmd.exe(命令提示字符)和近年来微软大力推广的 Windows PowerShell。 Linux下有bash / sh / ksh / csh/zsh等 一般情况下,习惯把命令行shell(CLI shell)直接称做shell,以后,如果没有特别说明,shell就是指 CLI shell,后文也是主要讲Linux下的 CLI shell。

2、交互方式

根据交互方式的不一样,命令行式shell(CLI shell),又分为交互式shell和非交互式shell。

2.1、交互式shell

交互式模式就是shell等待你的输入,并且执行你提交的命令,然后马上给你反馈。这种也是我们大多数时候使用的。

2.2、非交互式shell

非交互式shell,就是把shell放在写在一个文件里面,执行的时候,不与用户交互,从前往后依次执行,执行到文件结尾时,shell也就终止了。

3、shell的种类

在Linux下 ,各种shell百花齐放,种类繁多,不同的shell,也有不同的优缺点。 我们要查看当前系统下支持的shell,可以读取/etc/shells文件。

js字符串截取从最后一个字符_js jsonparse 无效字符_js切割字符串

3.1、bash

Bourne Again Shell 用来替代Bourne shell,也是目前大多数Linux系统默认的shell。

3.2、sh

Bourne Shell 是一个比较老的shell,目前已经被/bin/bash所取代,在很多linux系统上,sh已经是一个指向bash的链接了。 下面是CentOS release 6.5 的系统

3.3、csh/tcsh

C shell 使用的是“类C”语法,csh是具有C语言风格的一种shell,tcsh是增强版本的csh,目前csh已经很少使用了。

3.4、ksh

最早,bash交互体验很好,csh作为非交互式使用很爽,ksh就吸取了2者的优点。

3.5、zsh

zsh网上说的目前使用的人很少,但是感觉使用的人比较多。 zsh本身是不兼容bash的,但是他可以使用仿真模式(emulation mode)来模拟bash等,基本可以实现兼容。 在交互式的使用中,目前很多人都是zsh,因为zsh拥有很强大的提示和插件功能,炫酷吊炸天。推荐在终端的交互式使用中使用zsh,再安利一个插件Oh My Zsh 其实我个人的理解是,在终端中使用shell,基本上只是调用各种命令,比如:curl cat ls等等,基本不会使用到zsh的编程,所以终端中使用zsh是可以的。但是在写shell脚本的时候,需要考虑兼容性, 最主流的还是bash shell,所以,后文我们介绍的shell脚本也是bash shell的。

4、shell脚本

4.1、基础

#!/bin/bash
echo "Hello World !"

#!:是一个特殊的标记,表明使用啥解释器来执行,比如这里使用了:/bin/bash 来执行这个脚本。 #:只用一个#,就是注释 echo:输出 我们把上面的脚本保存成一个文件, 1.sh 后面的这个sh是shell脚本的扩展名。 然后要怎嚒来执行呢?执行一个shell脚本有很多种方式:

这个是因为没有这个脚本没有执行权限,运行 chmod a+x 1.sh 加上执行权限即可。 这里顺带说一下,为啥直接运行1.sh不行呢?因为他默认是去PATH里面找程序,当前目录,一般都不在PATH里面。所以直接运行1.sh就回报找不到文件。

根据测试,#!/bin/bash 的标记,只是针对第二种方式 ./xxx.sh的方式有效。本文中代码,第一行均为这个标记,为了节约篇幅,已经省略.

js切割字符串_js jsonparse 无效字符_js字符串截取从最后一个字符

执行并获取返回结果,有点类似JavaScript 的eval函数。

#!/bin/bash
dt=`date` #反引号内的字符串会当作shell执行 ,并且返回结果。
echo "dt=${dt}"

4.2、Shell 变量

shell的使用比较简单,就像这样,并且没有数据类型的概念,所有的变量都可以当成字符串来处理:

#!/bin/bash
myName="tom"
youName="cat"

不需要申明,直接写就可以了,但是有几个点需要特别注意:

使用变量

ABC="tom"
echo $ABC #使用变量前面加$美元符号
echo "ABC=$ABC" #可以直接在字符串里面引用
echo "ABC=${ABC}" #但是建议把变量名字用{}包起来

只读变量

ABC="tom"
echo "ABC=${ABC}"
readOnly ABC #设置只读
ABC="CAT" #会报错,因为设置了只读,不能修改

js字符串截取从最后一个字符_js切割字符串_js jsonparse 无效字符

删除变量

ABC="tom"
echo "ABC=${ABC}"
unset ABC #删除
echo "ABC=$ABC" 
echo "ABC=${ABC}" 

js字符串截取从最后一个字符_js切割字符串_js jsonparse 无效字符

从这个例子当中,我们也发现,使用一个不存在的变量,shell不会报错,只是当作空来处理。

4.3、Shell 的字符串

使用字符串

NAME="tom"
A=my #你甚至可以不用引号,但是字符串当中不能有空格,这种方式也不推荐
B='my name is ${NAME}' #变量不会被解析
C="my name is ${NAME}" #变量会解析
echo $A
echo $B
echo $C

执行结果

js字符串截取从最后一个字符_js切割字符串_js jsonparse 无效字符

我们可以发现,这个字符串的单双号和PHP的处理非常类似,单引号不解析变量,双引号可以解析变量。但是都可以处理转义符号。

A='mynnamenisntom'
B="mynnamenisntom"
echo $A
echo $B

执行结果

js字符串截取从最后一个字符_js切割字符串_js jsonparse 无效字符

拼接字符串 其实shell拼接字符串,大概就是2种

NAME="TOM"
# 使用双引号拼接
echo "hello, "$NAME" !" #直接写在一起,没有字符串连接符
echo "hello, ${NAME} !" #填充模版
# 使用单引号拼接
echo 'hello, '$NAME' !' #直接写在一起,没有字符串连接符
echo 'hello, ${NAME} !' #上面已经提高过,单引号里面的变量是不会解析的

js切割字符串_js字符串截取从最后一个字符_js jsonparse 无效字符

强大的字符串处理 shell中简单的处理字符串,可以直接使用各种标记,只是比较难记忆,要用的时候,可以查一下。

ABC="my name is tom,his name is cat"
echo "字符串长度=${#ABC}" # 取字符串长度
echo "截取=${ABC:11}" # 截取字符串, 从11开始到结束
echo "截取=${ABC:11:3}" # 截取字符串, 从11开始3个字符串
echo "默认值=${XXX-default}" #如果XXX不存在,默认值是default
echo "默认值=${XXX-$ABC}" #如果XXX不存在,默认值是变量ABC
echo "从开头删除最短匹配=${ABC#my}" # 从开头删除 my 匹配的最短字符串
echo "从开头删除最长匹配=${ABC##my*tom}" # 从开头删除 my 匹配的最长字符串
echo "从结尾删除最短匹配=${ABC%cat}" # 从结尾删除 cat 匹配的最短字符串
echo "从结尾删除最长匹配=${ABC%%,*t}" # 从结尾删除 ,*t 匹配的最长字符串
echo "替换第一个=${ABC/is/are}" #替换第一个is
echo "替换所有=${ABC//is/are}" #替换所有的is

运行结构

js字符串截取从最后一个字符_js切割字符串_js jsonparse 无效字符

这里只是介绍了比较常用的一些字符串处理,实际shell支持的还有很多。

4.4、数组

Bash Shell 也是支持数组的,与绝大部分语言一样,数组下标从0开始。不过需要注意的是,它只支持一维数组。 定义一个数组,用小括号阔气来,当中用“空格”分割,就像下面这样:

array=("item0" "item1" "item2")

也可以根据下标来定义元素

array[0]="new_item0"
array[1]="new_item1"
array[2]="new_item2"
array[4]="new_item4" #数组下标可以是不连续的

读取数组元素,和变量类似

echo ${array[0]}
echo "array[0]=${array[0]}"

获取数组所有的元素

echo "数组的元素为: ${array[*]}"
echo "数组的元素为: ${array[@]}"

获取数组的长度

echo "数组的长度为: ${#array[*]}"
echo "数组的长度为: ${#array[@]}"

4.5、输入输出

4.5.1、echo

在上文中,其实我们已经到多次,就是:echo “字符串” 来输出,一个很简单的例子

echo "Hello world!"

如果当中包含特殊符号,可以使用转义等:

echo "Hello nworld!"
echo ""Hello""
echo '"Hello"' #当然,也可以这样,单引号不转义,上文提到过
echo `date` #打印执行date的结果
echo -n "123" #加-n 表示不在末尾输出换行
echo "456"
echo -e "a处理特殊符号" #-e 处理特殊符号

-n 让echo输出结束以后,在默认不输出换行符 -e 让echo处理特殊符号,比如:

符号作用 a发出警告声 b删除前一个字符 c后不加上换行符号 f换行但光标仍旧停留在原来的位置 n换行且光标移至行首 r光标移至行首,但不换行 t插入tab 上面的特殊符号,写到mac的shell脚本里面要注意,执行的时候,要用bash执行才有效 ,sh无效。

当然,你也可以玩一点更有趣的,就是我们随时在终端中看到的五颜六色的文字:

echo -e "33[31m 红色前景 33[0m 缺省颜色" 
echo -e "33[41m 红色背景 33[0m 缺省颜色" 

其中 33[是一个特殊标记,表示终端转义开始, 31m表示使用红色字体,你也可以使用其他颜色,[30-39]是前景颜色,[40-49]是背景颜色。 33[0m回复到缺省设置 还可以有一些其他的动作

echo -e "33[2J" #清除屏幕
echo -e "33[0q" #关闭所有的键盘指示灯
echo -e "33[1q" #设置"滚动锁定"指示灯(Scroll Lock)
echo -e "33[2q" #设置"数值锁定"指示灯(Num Lock)
echo -e "33[1m" #设置高亮度
echo -e "33[4m" #下划线
echo -e "33[7m" #反显
echo -e "33[y;xH" #设置光标位置 

其他更多的特殊码请自行查询。

4.5.2、read

有输出,必然有输入,read命令接收标准输入的输入。

read name
echo "my name is ${name}"

可以使用-p给一个输入提示

read -p "please input your name:" name
echo "my name is ${name}"

如果没有指定输入的变量,会把输入放在环境标量REPLY中

read -p "please input your name:"
echo "my name is ${REPLY}"

计时输入,如果一段时间没有输入 ,就直接返回,使用-t 加时间

read -t 3 -p "please input your name in 3 senconds:" name

指定输入字符个数,使用-n ,后面的是输入字符个数

read -n 1 -p "Are you sure [Y/N]?" isYes

默读(输入不再监视器上显示),加一个-s参数。

read -s -p "Enter your password:" password

4.5.3、printf

echo已经比较强大,但是有的时候,我们需要用到字符串模版输出,printf就比较好用了,他类似C里面的printf程序。 语法是:printf format-string [arguments…] 比如我们要输出一个表格

printf "%-10s %-8s %-4sn" 姓名 性别 体重kg 
printf "%-10s %-8s %-4.2fn" 郭靖 男 66.1234 
printf "%-10s %-8s %-4.2fn" 杨过 男 48.6543 
printf "%-10s %-8s %-4.2fn" 郭芙 女 47.9876 

运行结果

js切割字符串_js jsonparse 无效字符_js字符串截取从最后一个字符

%s %c %d %f都是格式替代符 %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),至少显示10字符宽度,如果不足则自动以空格填充,超过不限制。 %-4.2f 指格式化为小数,其中.2指保留2位小数。

4.5.4、重定向

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

命令作用 command > file将输出重定向到 file。 command > file将输出以追加的方式重定向到 file。 n > file将文件描述符为 n 的文件重定向到 file。 n >> file将文件描述符为 n 的文件以追加的方式重定向到 file。 n >& m将输出文件 m 和 n 合并。 n &1 &

这样就把输出和错误重新定向到out.log文件了 但是,我们发现,关闭终端以后,文件就不输出了。 当我们端口连接远程主机的session或者关闭当前终端的时候, 会产生一个SIGHUP信号 ,导致程序退出,我们可以使用nuhup来忽略这个信号 ,达到真正的后台。

nuhup sh d.sh > out.log 2>&1 &

这样启动程序,就可以打到真正后台运行了。 那么问题来了,我们验证程序在后台运行呢?要怎嚒结束后台程序呢?请继续看。

5.2、cat

在本文中,我们已经多次用到cat,他的作用就是读取文件输出到标准输出上,也就是我们的终端。 语法是:

cat [option] file

我们也可以使用:cat -n file ,来输出行号。

5.2、tail

类似上面的例子,我们要验证程序是不是在后台,每一秒输出一个数字到文件,使用cat读取,需要不断的多次查看,一次cat只能输出一次。 tail非常适合查看这种日志类文件,他的作用是读取文件末尾几行输出到标准输出上。 tail out.log 默认显示10行,可以使用参数-n指定行数 tail -20 out.log 显示文件末尾20行 tail -f out.log 持续监控文件out.log,如果有变化,他会试试的显示在我们的屏幕上面。

5.3、ps

ps,查询进程 这个命令参数比较多,列举几个比较常用的

参数作用 a显示终端上的所有进程,包括其他用户的进程。 u显示面向用户的格式信息。 x显示没有控制终端的进程。 一般查询,使用 ps aux就可以了,查询出来比较多,可以筛选一下。 这里我们使用 ps u 就可以查询出我们刚才开启的后台进程了。

js字符串截取从最后一个字符_js切割字符串_js jsonparse 无效字符

我们看到我们刚才启动的程序PID为7523, 使用kill命令就可以杀死他了

5.4、kill

kill命令比较简单,就是根据PID结束一个程序,比如我们已经查询到,我们开的后台进行是7523,要结束他可以使用: kill 7523 以上是常用用法,其实kill是给程序发送一个信号js切割字符串,上面的程序给会程序发送一个SIGTERM信号,程序收到这个信号,完成资源的释放,就退出了。 但是也有程序不听话,收到信号就是不退出,这个时候,就要强制他退出,使用9号命令(SIGKILL),强制杀死他。 简单的说 kill PID 是告诉程序,你应该退出了,请自己退出。 kill -9 PID ,是直接告诉程序,你被终结了,这个命令信号,不能被抓取或者忽略。

6、总结

限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688