(linux shell)第一章--小试牛刀(上)

来源:(linux shell)第一章--小试牛刀(上)

从今天开始,我们一起来学习《linux shell脚本攻略》这本书。

1.1简介

shell脚本通常是一个以#!起始的文本文件,如下所示:

#!/bin/bash

有两种执行shell脚本的方式,分别如下:

sh script.sh 或者./script.sh

但是在执行脚本以前,我们需要给脚本执行权限才行,不然脚本无法执行

chmod a+x script.sh

在命令中行中,如果需要同时执行多个命令,可以使用

cmd1;cmd2

1.2中断打印

1.2.1 实战演练

echo 是用于中断打印的基本命令。

在默认情况下,echo在每次调用后会添加一个换行符。

只需要使用带双引号的文本,结合echo命令就可以将该文本在中断上打印出来,类似的,不待双引号的文本也可以得到童谣的输出结果:

使用单引号看起来也可以完成同样的任务:

这些方法看起来相思,但各有一些特殊用途和副作用,看看下面这行命令:

看到命令行抛出一个错误,说不能带有感叹号。因此,如果希望打印感叹号,那就不要将其放入双引号中,或者你可以在其之前加上一个特殊的转移字符斜杠将感叹号转移:

在使用带单引号的echo时,Bash不会对单引号中的变量(如$var)求值,而只是照原样显示

另一个可以打印的命令是printf,printf使用的参数和c语言中的printf函数一样。如:

看到没,printf打印出来的输出是没有带换行的。

1.2.2补充内容:

打印彩色输出。每种颜色都有对应的颜色码,比如:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37.要打印彩色文本,可以输入如下命令:

1.3 玩转变量和环境变量

1.3.1 实战演练

一个变量可以通过以下方式进行赋值:

var=value

var是变量名,value是赋给变量的值,如果value不包含任何空白字符,那么它不需要使用引号进行引用,繁殖,则必须使用单引号或双引号。注意,var = value不同于var=value.把var=value改写成var = value使用常见错误,但前者是赋值操作,后者则是相等操作。在变量名之前加上$前缀就可以打印出变量的内容

var="value"

echo $var 或者echo ${var},可以看到下图中,第一个命令是错误的,第二三个命令整错打印出了变量内容:

我们也可以在printf或echo命令的双引号中引用变量值:

export命令用来设置环境变量。至此之后,从当前shell脚本执行的任何程序都会继承这个变量。我们可以按照自己的需要,在执行的应用程序或者shell脚本中导出特定变量。在默认情况下,有很多标准环境变量可供shell使用。PATH就是其中之一

$ echo $PATH

通常$PATH的值在/etc/environment或者/etc/profile或者~/.bashrc中定义。如果需要在PATH中添加一条新路径,可以使用:

export PATH=$PATH:/home/user/bin

1.3.2 补充内容:

获取字符串的长度,可以使用下面的方法或者:

识别当前shell的版本:

echo $SHELL 或者echo $0

修改Bash提示字符串

当我们打开一个终端或是运行一个shell,都会看到类似[email protected]:/home/$的提示字符串。不同的GNU/Linux发布版本中的提示及颜色也略有不同。我们可以利用PS1环境变量来定制提示文本。默认的shell提示文本是在文件~/.bashrc中的某一行设置的。可以使用如下命令列出设置PS1的那一行:

如果要设置提示字符串,可以输入:

PS1=">",如下图所示,提示符已经变成">"尖括号了,但是这样的修改只对当前的这个终端起作用,如果再新开一个终端或者电脑重启,则会恢复到修改以前的提示符。要想设置之后生效,就必须修改~/.bashrc中的值才可以。

1.4 通过shell进行数学运算

1.4.1 预备知识

再Bash shell环境中,可以利用let,(())和[]执行基本的算术操作。而在进行高级操作时,expr和bc这两个工具也会非常有用。

1.4.2 实战演练

可以用普通的变量赋值方法定义数值,这时,它会被存储为字符串。然而,我们可以用一些方法使它能像数字一样进行处理,如下图所示:

当然还可以进行变量的自增或者自减操作:

其它的算术操作方式:

bc是一个用于数学运算的高级工具,这个精密计算器包含了大量的选项。我们可以借助它执行浮点数运算并应用一些高级函数:

对设置bc参数的其它操作:

1.5 玩转文件描述符和重定向

?1.5.1 预备知识

?我们在编写脚本的时候会频繁使用标准输入(stdin),标准输出(stdout)和标准错误(stderr)。通过内容过滤将输出重定向到文件是我们从事的基础任务之一。当命令输出文本的时候,这些输出文本有可能是错误信息,也有可能是正常的(非错误的)输出信息。单靠查看输出的文本本身,我们没法区分哪些是正常的输出文本,哪些是错误文本。不过,我们可以通过文件描述符来解决这个问题,将哪些与特定描述符关联的文本提取出来。

?文件描述符是与一个打开的文件或数据流相关联的整数。文件描述符0,1以及2是系统预留的。

?    ?0-----------stdin(标准输入)

?    ?1-----------stdout(标准输出)

?    ?2-----------stderr(标准错误)

?1.5.2 实战演练

?    ?用下面的方法可以将输出文本重定向或保存到一个文件中:

?    ?echo "This is a sample text 1" > temp.txt

?    ?这种方法通过截取文件方式,将输出文本存储到文件temp.txt中,也就是说在把echo命令的输出写入文件之前,temp.txt中的内容首先会被清空。

?    ?接下来再看另一个例子:

?    ?echo "This is a sample text 2" >> temp.txt

?    ?这种方法将会将文本追加到目标文件中。

?    ?>和>>并不相同。尽管这两个操作符都可以将文本重定向到文件,但是前者会先清空文件,再写入内容,而后者将内容追加到现有文件的尾部。

?    ?

?    ?来看看什么是标准错误以及如何对它重定向。当命令输出错误信息时,stderr信息就会被打印出来。看看下面的例子:

?    ?

这里,+是一个非法参数,因此将返回错误信息。注意:当一个命令发生错误并退回时,它会返回一个非0的退出状态;而当命令成功完成后,它会返回数字0,退出状态可以从特殊变量$?中获得(在命令执行之后立刻运行echo
$?,就可以打印出退出状态)

?    ?接下来,我们不让错误信息打印在终端,而是存入一个文件中:

?    ?注意命令是ls + 2>out.txt。错误信息输出到out.txt中

?    ?我们也可以将标准输出和标准错误信息一同来执行到同一个命令中:

?    ?可以看到,错误信息和标准输出被输出到不同的文件当中了。还可以通过如下的命令将stderr转换成stdout,使得stderr和stdout都被重定向到同一个文件中:

?    ?cmd 2>&1 output.txt 或者cmd &> output.txt。有时候,在输出中可能包含一些不必要的信息。如果你不想让终端中充斥着有关stderr的繁枝末节,那么你可以将stderr的输出重定向到/dev/null,保证一切都会被清除的干干净净。假设我们有三个文件,分别是a1,a2,a3。但是普通用户对文件a1没有“读-写-执行”权限。如果你需要打印文件名以a起始的所有文件的内容,你可以使用cat命令:

?    ?可以看到,a1文件已经没有任何权限,但是因为我是用root用户登录,所以还是可以读内容的,如果其它用户读取a1,则会报错,这时我们就可以使用标准错误输出来捕获错误输出,然后输出其它文件的内容:

?    ?

?1.5.3
补充内容?    ?    ?

?    ?从stdin读取输入的命令能以多种方式接受数据。另外,还可以用cat和管道来制定我们自己的文件描述符,例如:

?    ?cat file | cmd

?    ?cmd1 | cmd2

?    ?将文件重定向到命令:

?    ?cmd < file

(linux shell)第一章--小试牛刀(上)

时间: 2024-10-12 23:29:29

(linux shell)第一章--小试牛刀(上)的相关文章

(linux shell)第一章--小试牛刀(下)

文章来源: (linux shell)第一章--小试牛刀(下) 1.6 数组和关联数组 1.6.1 预备知识 Bash同一时候支持普通数组和关联数组.普通数组仅仅能使用整数作为数组索引,而关联数组能够使用字符串作为数组索引.关联数组在非常多操作中相当实用. 1.6.2 实战演练 定义数组的方法有非常多,能够在单行中使用一列值来定义一个数组: array_var=(1,2,3,4,5,6)   #这些值将会存储在以0为起始索引的连续位置上 另外.还能够将数组定义成一组索引-值: array_var

(linux shell)第二章--命令之乐(一)

文章来自于我的个人博客:(linux shell)第二章--命令之乐(一)    上一章我们描写叙述了一些linux shell中须要注意的一些语法.接下来我们開始了解linux shell的经常使用命令.let's go... cat 命令: cat本身表示拼接(concatenate).cat命令有一些经常使用參数,像-n,-s等,我们以下逐一介绍: 假设你想高速查看一个文本文件内容.就能够使用cat命令: cat file 假设你想一次查看多个文件内容.也是在后面加上文件路径就可以 cat

深入理解Linux内核 第一章 绪论

Unix 文件系统概述 Unix的每个进程都有一个当前工作目录. 为标识一个特定的文件,进程使用路径名.如果路径名第一个字符是斜杠,那么这个路径是绝对路径,其起点是根目录:如果第一项是目录名或者文件名,那么这个路径就是相对路径,其起点是进程的当前目录. 硬链接的限制 1)不允许用户给目录创建硬链接,因为这可能把目录的树形结构变成环形结构. 2)只有在同一文件系统中的文件之间才能创建硬链接.此限制较大,因为现代Unix系统可能包含多种文件系统,这些文件系统位于不同的磁盘和/或分区,用户也无法知道他

菜鸡学linux。第一章。初见LINUX

#################虚拟机控制############## [kiosk@foundation0 Desktop]$ rht-vmctl start desktop ###开启desktop虚拟机 Error: desktop not started (is already running) ###报错,desktop已经运行 [kiosk@foundation0 Desktop]$ rht-vmctl view  desktop ###显示desktop [kiosk@found

Linux学习第一章

在过去的一个多星期时间里,我通过在线观看aminglinux教学视频进行学习Linux系统,初步了解和接触了Linux. 1.Unix.Linux.GUN.gpl是什么? Linux常见发行版 SlackWare .Suse .Debian.Android等等(ios属于Unix) Linux可以做服务器,跑网站,个人PC操作系统,手机系统,路由器,物联网等等 2.创建虚拟机 安装vmware或者virtualbox,下载镜像文件centos-isos,创建虚拟机,不改显示器分辨率,改了会导致黑

linux shell 再指定日期上增加或者减去一小时或者一分钟

在指定的日期上减去指定的天 [[email protected] init_env]$ date -d "20150416 12 3 days" +"%Y%m%d%H" 2015041912 在指定的日期上加上指定的小时 [[email protected] init_env]$ date -d "20150416 12 3 hour" +"%Y%m%d%H" 2015041615 在指定的日期上减去指定的小时 [[email

Linux系统管理第一章

Linux命令用于实现某一类功能的指令或程序,命令的执行依赖于解释器程序 Linux命令的通用格式  命令字   选项   参数 选项:用于调节命令的具体功能 参数:命令的对象,如文件,目录名 基础命令ip a 查看Linux  ip ifup  网卡(一般eno开头) 激活网卡 常用命令快捷键 tab:补全命令,补全文件名 \  :强制换行 Ctrl+U:快速删除光标前的字符 Ctrl+K:快速删除光标后的字符 Ctrl+L:清屏 Ctrl+C:结束当前正在编辑的命令 Ctrl+D:注销 Ct

linux shell 在给定日期上加上或者减去指定的天数

减去一天 [[email protected] init_env]$ date -d "20150416 -1 days" "+%Y%m%d" 20150415 减去三天 [[email protected] init_env]$ date -d "20150416 -3 days" "+%Y%m%d" 20150413 加上三天 [[email protected] init_env]$ date -d "2015

linux笔记第一章--基本命令记载

显示日期的指令: date 显示日历的指令: cal 简单好用的计算器: bc 显示日期的指令: date 如果在文字接口上面,想要知道目前的时间,那么就直接在指令列模式输入 date 即可显示: [[email protected] ~]# date Thu Jun 23 11:32:02 CST 2005 上面是显示:星期四, 六月二十三日, 11:32 分, 02 秒,在 2005 年的 CST 时区!请赶快动手做做看呦! 好了,那么如果我想要让这个程序显示出『 2005/06/23 』这