如何将 shell script 用的风生水起(1)

最近接触最多的系统就是 linux 和 Mac,作为从 window 转过来用户,开始的确有些不适应,操作习惯有些不算适应。不过随着逐渐了解 linux 发现 linux 系统对于程序员还是友好的。感觉工作起来比较高效,对于处理一些批量任务和定时任务都比较方便,所以也想深入地聊一下 shell 编程。

linux.jpg

少不了会用到 linux 命令。而且许多时候借助 python 来对文件进行操作,不过我们也可以使用 shell script 来实现同样效果。

shell

首先我们来看什么是 shell,shell 本身还以就是贝壳、壳,那么其实 shell 是用户和系统 kernel 间的桥梁,那么大家都知道 kernel 是用于控制 CPU、内存或者磁盘,在 linux 和 Unix-like 这样系统都支持 shell script,shell script 是一种直译程序,并不需要编译直接执行。

linux_shell.png

Linux Shell的种类很多,目前流行的 Shell 包括ash、bash、ksh、csh、zsh等,种类多了,也就有了标准化的要求,这就是POSIX的由来。我们这里主要以 bash shell 为主,其他 shell 也是大同小异。可以通过下面的命令查看使用系统所支持的 shells 类型。

cat /etc/shells
复制代码

Bash shell

BASH (Bourne Again SHell) 之所以流行是因为其强大功能,那么这里强大具体来说,其中一个就是自动补全功能,例如当我们使用 ls 命令,按下 tab 键会自动搜索指定目录下目录或者文件名称根据你的输入给予补全。

然后可以通过以下

which bash
复制代码

查看 bash 的位置

hello world

我们可以创建我们第一个 shell 脚本,创建名称为 hello.sh 这里扩展名并没有实际意义,可以完全不用扩展名,不过 .sh 除了可以表示该文件类型,同时好处是告诉像 VSCode 这样 IDE 这个文件 shell 脚本,这些 IDE 会对其进行美化或者支持一些友好的提示,便于你阅读和开发 shell 脚本

-rw-r--r--   1 jangwoo  staff     0  3 13 11:27 hello.sh
复制代码
#! /bin/bash
复制代码

在 #! 后面定义脚本解释器,这里可以指定为我们刚刚通过 which bash 查询到 bash 位置,接下来我们使用

#! /bin/bash
echo "Hello world"
复制代码

想要执行一个脚本可以使用 bash hello.sh 或者 ./hello.sh 的方式来执行 hello.sh 脚本。

-bash: ./hello.sh: Permission denied
复制代码
chmod +x hello.sh
复制代码

注释

在 shell script 中,是以 # 符号表示注释,以 # 开头行,整行内容为注解,如果 # 出现在行中,从 # 后面到行尾所有内容注解,如下

#! /bin/bash
# this is a comment
echo "Hello world" #this is a also comment
复制代码

变量

在 shell script 变量主要分为系统变量和用户变量,系统变量顾名思义是由系统所创建和维护,而用户变量则是由用户来创建和维护的。

#! /bin/bash
# this is a comment
echo "Hello world" #this is a also comment

echo $BASH
echo $BASH_VERSION
echo $HOME
echo $PWD
复制代码

使用等号给定义变量进行赋值,注意=两侧不能有空格,定义变量时无需像其他语言一样有关键字类似 var 然后在使用是否需要在变量前加上 $ 有点类似取值符号。

name=zidea
echo $name
echo the username $name
复制代码

如果变量值中存在空格,则需要用单引号或者双引号将其包裹

title='machine learning tut'
echo $title
复制代码

如何读取用户输入

可以使用 read 后面空格后跟随一个变量,这个变量用于接收用户输入。

#! /bin/bash

echo "Enter title:"
read title
echo "Enter title: $title" 
复制代码

我们可以在 read 定义多个变量,这些变量之间以空格间隔来区分,然后可以接受多个用户输入,用户输入以空格间隔来区分对应到不同变量上,如果用户输入无法对应上,如果少于变量数,这最左侧也就是第一变量来进行对齐,剩余变量没有赋值,如果用户输入多于变量数,输入多余内容都会赋值给最后(最右侧)的变量

echo "Enter title:"
read title subtitle level
echo "Enter title: $title"
echo "Enter subtitle: $subtitle"
echo "Enter level $level" 
复制代码

注意当我们 $title 放入语句中,需要使用双引号来包裹语句

Enter title:
machine leanring deep learning 3
Enter title: machine
Enter subtitle: leanring
Enter level deep learning 3
复制代码

接下来介绍几个 read 的选项,-p 表示用户输入内容和 read 后面提示内容位于同一行,而 -s 表示不会再屏幕上显示用户输入内容。

echo "Enter title:"
read -p 'title:' title
echo "title: ${title}"
复制代码
#! /bin/bash

echo "Enter username and password:"
read -p 'username:' username
read -sp 'password:' password
echo "username: ${username}, password ${password}"
复制代码

可以通过 -a 来表示接受任意多的输入并且将他们以数组形式保存在一个变量里

echo "input titls"
read -a titles
echo "title ${titles[0]},title ${titles[1]}"
复制代码

如果在 read 后面没有跟随接收输入变量,如下,我们可以用 $REPLY 这个变量来接收用户输入

#! /bin/bash
echo "input titls"
read 
echo $REPLY
复制代码

猜你喜欢

转载自juejin.im/post/7074748121820954660