右脚前掌踏入shell领域!

2019-06-03  本文已影响0人  Rotonnn

shell 的版本

一个 shell 脚本第一行第一件事是 “确定本个脚本用什么 shell 执行”。

##! bin/bash

这是比较普遍的,用 bash 执行脚本。

还有一些其他的 shell ,他们在 /bin/ 目录下,比较常见的有 tcsh / zsh / csh / sh 。他们在擅长领域有所不同。在用户登录时,系统通过 /etc/password 下面登录用户条目的第七个字段选择默认的 shell。

结构化命令!

test 命令

if 是最基础做判断用的结构语句。关于它的判断有两种形式

讲讲 condition! :

类型 判断符号 备注
整数 -eq , -ne , -ge , -le , -gt , -lt 只能比较整数
字符串 > , < , = , != ①在 [ ] 中要转义大小写,以免变成重定向符号;②condition中是根据ASCII码进行比较,Sort是根据本地字符
文件 -r , -w , -x , -d , -f , -e , -O ,-G , -nt , -ot

高级 test condition:

处理命令行输入!

参数

其他的语言,比如讲 C,将参数传入函数前,需要在函数名后声明参数的数量和名字,比如:

int main(int a,char b){...}

shell 不需要这种声明。直接在函数后面跟要传入的参数就好

$./main.sh a b

传入的参数最多可以有 9 个,在代码中,用 $x 的方式来指代第 x 个参数。
有这些关于参数的取用方法:

$0 取到脚本名,用 basename( $0 ) 可以过滤掉执行脚本命令前面的路径,取到纯粹的脚本名。

选项

为了方便操作,最好是在命令下提供一些精细化选项,(比如 ls -al-al

while [ -n $1]
do
    case "$1" in 
    a) <cmd> ;;
    b | c) <cmd> ;;
    *) <cmd>;;
    esac
    shift           ##参数左移一位
done

通过这样一个代码块就可以实现最基础的命令选项功能了。

不过一个贴心靓仔还需要更加以人为本一些。为了处理 -xyz 这样的用户输入,还需要使用一些工具的帮助。

 getopts <optstring> <parameters>

脚本用法:

set -- $( getopt ab:cd "$@" )
//脚本内容...//

假如传入的选项是 -xyz ,传入后会被 getopt 格式化成 -x -y -z 再通过set替换原来的选项。最后再为脚本所用。

但是getopt也有局限性!它不能处理带分隔符的参数,如果参数是"test3 test4" ,它会把这个参数分别看成两个带引号的参数。这个时候就需要更高一级的getopts了。

输入输出重定向

标准文件描述符

Linux 将每个对象都当做文件处理,这也包括了输入和输出进程。通过文件描述符,Lunix可以对每个文件对象进行标识。

每个进程一次最多可以有 9 个文件标识符,不过 bash 只保留了前三个:

文件描述符 缩写 描述 最初定位 符号
0 STDIN 输入 键盘 <
1 STDOUT 输出 屏幕 >
2 STDERR 错误 屏幕 >

可以单独重定位:

    ls -al test badtest test1 2> test2
    -rw-r--r-- 1 陈辛辛 197121 53 5月  14 17:39 test2
--------------------------------------------------------------------
    $ cat test2
    ls: cannot access 'test1': No such file or directory
    ls: cannot access 'badfile': No such file or directory

也可以全部重定向:

    $ ls -al test1 badtest test2 &> test3
--------------------------------------------------------------------
    $ cat test3
    ls: cannot access 'test1': No such file or directory
    ls: cannot access 'badtest': No such file or directory
    -rw-r--r-- 1 陈辛辛 197121 108 5月  14 17:39 test2

临时重定向和永久重定向

控制脚本

linux信号

信号 描述
1 SIGUP 挂起进程
2 SIGINT 终止进程
3 SIGQUIT 停止进程
9 SIGKILL 无条件终止进程
15 SIGTERM 尽可能终止进程
17 SIGSTOP 无条件停止,但不是终止进程
18 SIGTSTP 停止或暂停,但不终止进程
19 SIGCONT 继续运行停止的进程

信号的操作!

作业控制

把作业放在后台运行可以使用& 命令。 nohup命令起到辅助作用,它可以阻断所有发送给该进程的SIGHUP信号,就算终端退出了也不停止,不仅如此它还会自动把输出 >> 到一个叫做 nohup.out 的文件,使输出不会哐哐往屏幕上蹦。

虽然jobs本人对作业的状态没什么影响,但是很多命令需要它的帮忙。
bg把暂停命令在后台重启;fg把暂停命令前台重启;kill杀死进程;
都需要jobs查看他们的PID

上一篇下一篇

猜你喜欢

热点阅读