这篇随笔将要介绍关于Shell编程的基本知识,这些将会在假设你已经熟悉了Linux系统和命令行的基本知识。

构建基本脚本

你应该了解或熟悉使用Shell命令行了,但是只是使用Shell命令行的命令,有些问题处理起来又会显得繁琐,当你要经常重复处理类似复杂的事的时候,

那么将它写成一个脚本就是一个不错的主意。

当然在命令行中,你可以将两个命令在一个提示行中输入他们,用分号隔开。

$ pwd;where
/tmp
forever :0 2017-11-08 15:12 (:0)
forever pts/0 2017-11-08 15:12 (:0)
$

这就是一个简单的脚本,但是这样的脚本每次都要将所有要执行的命令都放在命令行中,也许一个很小的脚本你可以接受,但是如果是一个很复杂的脚本,我想那就不会是你想要的了。

创建脚本文件

那么既然你不想将所有的命令都写在命令行上,那么就将这些命令都写在一个文件中,那么只需要你运行这个文件就可以了。

在写一个Shell脚本文件的时候,你一定要做的是在第一行,要指定使用的Shell,如下:

#!/bin/bash

这里就告诉你要使用 bash shell 来运行你的脚本程序。

我们就将刚才的简单的脚本写成脚本文件。

#!/bin/bash
pwd
who

将文件命名为shell1,现在你就要运行这个脚本文件了,但是它可能不如你所想,我们可以试试看。

$shell1
bash: shell1: 未找到命令...
$

bash shell并没有找到你写的这个命令,因为你写的脚本所在的目录,并不在PATH环境变量中。

为了解决这个问题,有两个办法:

一、把你当前的目录添加到PATH中。

二、用绝对路径或相对路径引用Shell脚本文件。

我想在现在的情况下将这个脚本的目录添加到PATH并不是一个好办法,那么就使用第二种方法,当前目录用点操作符来表示。

$./shell1
bash: ./shell1: 权限不够
$

哇竟然权限不够,查看一下文件权限就可以知道,文件创建的时候的权限就以已经由你的umask的值决定了

$ ls -l shell1
-rw-rw-r--. 1 forever forever 21 11月 8 16:24 shell1
$

那我们就该shell1添加执行的权限。

chmod u+x shell1

现在再执行试试看

$ ./shell1
/tmp
forever :0 2017-11-08 15:12 (:0)
forever pts/0 2017-11-08 15:12 (:0)
$

显示消息

有的时候你需要在你脚本中给用户一些信息,如何让这些信息显示。

那你就要用到了 echo 命令,echo命令本身就是显示一个字符串。

$echo Hello
Hello
$

默认情况下 echo 后面直接加上你要输出的字符串就可以,但是有的时候就不如你所愿。

$ echo Let's go home
> '
Lets go home
$

因为在你出现引号的时候它认为引号中的都是一部分,所以在出现单出来的引号的时候,就要让你把引号补全,所以如果出现其中一种引号就需要在最外面用另一种引号把字符串全部包起来。

$ echo "Let's go home"
Let's go home
$

现在我们将这个命令加到脚本文件中。

#!/bin/bash
echo "Welcome to use my shell!"
$ ./shell1
Welcome to use my shell!
$

现在想加入时间但我不想输出换行那么就加上 -n 参数。

#!/bin/bash

echo "Welcome to use my shell!"
echo -n "The time and data are:"
date
$ ./shell1
Welcome to use my shell!
The time and data are:2017年 11月 08日 星期三 17:21:44 CST
$

变量

有的时候只是使用单个命令并不能解决所有问题,而是需要其他数据来解决一些问题,这就可以通过变量来解决了。

在Linux系统中就存在这很多的变量,这些变量是环境变量,在变量前加上$符号就可以使用了。

#!/bin/bash

echo "Your PATH is:"
echo $PATH
$ ./shell2
Your PATH is:
/usr/lib64/qt-3.3/bin:/home/forever/perl5/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/forever/.local/bin:/home/forever/bin
$

当然除了这些环境变量,还可以定自己的变量,这些变量会一直在脚本中生效,直到脚本结束。

用户变量不可以超过20个字符,可以使用的字符是数字、字母、下划线,同时区分大小写。

#!/bin/bash

days=365
echo "if you try to think of the year as $days days ,it becomes unmanageable."
$ ./shell3
if you try to think of the year as 365 days ,it becomes unmanageable.
$

在一个变量给另一个变量赋值的时候一定要使用$否则就会被理解成一个字符串,如果想要在输出的使用一些特殊的符号如( $ )就需要在前面加上上一个反斜杠( \ )。

#!/bin/bash

value1=10
value2=20
echo "value1 is $value1"
echo "value2 is $value2"
value1=$value2
echo "value1=\\$value2 value1=$value1"
value2=value1
echo "value2=value1 value2=$value2"
$ ./shell3
value1 is 10
value2 is 20
value1=$value2 value1=20
value2=value1 value2=value1
$

如果你想将一个命令执行的值复制给变量,那么就可以使用( ` )反引号将命令包起来,

#!/bin/bash

where=\`pwd\`
echo "You are in $where"
$ ./shell4
You are in /tmp
$

未完待续......

Shell编程学习之Shell编程基础(一)的更多相关文章

  1. [转]Windows网络编程学习-面向连接的编程方式

    直接附上原文链接:windows 网络编程学习-面向连接的编程方式

  2. vb编程学习之路之基础与概念总结

    OOP (Object Oriented Programming)面向对象程序设计/面向对象编程 对象是代码和数据的集合,对象的三要素:属性.事件.方法 对象的命令规则:必须以字母或汉字开头,不能以数 ...

  3. shell script 学习笔记-----shell变量

    1.在赋值语句name=value中不能存在空格,例如:name = value这样的形式会被认为是三个变量,因为本质上来说,脚本的内容就是传给shell程序的变量,而变量之间是通过空格区分的.如果想 ...

  4. 【Todo】网络编程学习-面向工资编程

    https://zhuanlan.zhihu.com/p/20204159 这个系列真的非常好,好好领会学习一下

  5. -高级Javascript编程学习笔记----Javascript编程及架构设计最应该注意的基本点

    最小全局变量 JavaScript通过函数管理作用域.在函数内部生命的变量只在这个函数内部,别的地方不可用.全局变量是指在函数外或是未声明直接简单使用的.每个Javascipt环境有一个全局对象,当你 ...

  6. Linux简单编程学习心得

    在Linux环境下简单编程学习心得 linux编程过程 在上周的<信息安全设计基础>的课程学习中学习到了在虚拟的linux环境下简单的编程.学习过程中接触到了vim.gcc和gcd在实验楼 ...

  7. 【自学编程】C语言编程简单的小程序,计算长方体体积!

    计算长方体体积 有朋友会说长方体体积还不好算吗?长X宽X高.没错用计算器一下就可以出结果,编程反而麻烦些,但是我们说的是这种思维,如果复杂的重复运算的话写好程序就非常简单了. 简单运算下一个固定高度的 ...

  8. shell学习笔记1---shell编程基础

    Shell是什么? Shell 是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效.安全.低成本地使用 Linux 内核,这就是 Shell 的本质. Shell 本身并不是内核的一 ...

  9. Linux学习之Shell编程基础

    转自:http://my.oschina.net/itblog/blog/204410 1 语法基本介绍1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来 ...

随机推荐

  1. robotframework使用过程中遇到的一些问题

    问题1: 在ride上import library,显示红色解决办法:根据菜单栏tools--view ride log提示依次安装缺少的模块,包括natsort.xlrd.xlwd.xlutils, ...

  2. CSS动态伪类选择器温故

    动态伪类选择器 伪类选择器:大家熟悉的:[:link][:visited][:hover][:active]CSS3的伪类选择器分为六种:(1)动态伪类选择器(2)目标伪类选择器(3)语言伪类选择器( ...

  3. Tree UVA - 548(二叉树递归遍历)

    题目链接:https://vjudge.net/problem/UVA-548 题目大意:给一颗点带权(权值各不相同,都是小于10000的正整数)的二叉树的中序遍历和后序遍历,找一个叶子结点使得它到根 ...

  4. (转)cut命令详解

    Linux:cut命令详解   cut 文件内容查看 显示行中的指定部分,删除文件中指定字段 显示文件的内容,类似于下的type命令. 说明 该命令有两项功能,其一是用来显示文件的内容,它依次读取由参 ...

  5. python 在windows下监听键盘按键

    python 在windows下监听键盘按键 使用到的库 ctypes(通过ctypes来调用Win32API, 主要就是调用钩子函数) 使用的Win32API SetWindowsHookEx(), ...

  6. 基础10 多进程、协程(multiprocessing、greenlet、gevent、gevent.monkey、select、selector)

    1.多进程实现方式(类似于多线程) import multiprocessing import time,threading def thread_run():#定义一个线程函数 print(&quo ...

  7. [巩固C#] 一、特性是什么东东

    阅读目录   关闭   前言 特性是什么? 那么什么是“元数据”? 特性到底是什么? 我们自定义一个特性玩玩 什么是命名参数? 我们来继续要看看AttributeUsage(这个描... 自定义特性可 ...

  8. python 3.6 链接mssql 进行数据操作

    #!/usr/bin/env python # -*- coding: UTF-8 -*- import pymssql class MSSQL(object): ''' 对pymssql的简单封装 ...

  9. java NIO、BIO、AIO全面剖析

    在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 序号 问题 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步 ...

  10. nopCommerce 4.10 发布了

    我们的开发工作主要集中在将nopCommerce转移到.NET Core 2.1,性能和架构改进,进一步增强和修复错误. NopChommerce 中文社区:http://www.nopcn.com ...