Shell 简介

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

基本上Shell分两大类:
一:图形界面Shell(Graphical User Interface shell 即 GUI shell)
例如:
1、应用最为广泛的Windows Explorer (微软的windows系列操作系统)
2、广为人知的Linux shell,其中linux shell 包括X window manager,以及功能更强大的CDE、GNOME、KDE、 XFCE。

二:命令行式shell(Command Line Interface shell ,即CLI shell)
例如:
1、bash / sh / ksh / csh(Unix/linux 系统)
2、cmd.exe/ 命令提示字符(Windows NT 系统)


一、终端打印

echo是用于终端打印的基本命令。
1.显示普通字符串:

echo "It is a test"
这里的双引号完全可以省略,以下命令与上面实例效果一致:
echo It is a test
echo ‘It is a test’

2.显示转义字符

echo "\"It is a test\""
结果将是:
"It is a test"

3.显示变量

#!/bin/sh
read name
echo "$name It is a test"
输出结果:
OK #标准输入
OK It is a test #输出

4.显示换行

echo -e "OK! \n" # -e 开启转义
echo "It it a test"
输出结果:
OK! It it a test

5、read 命令
read命令是一个一个词组地接收输入的参数,每个词组需要使用空格进行分隔;如果输入的词组个数大于需要的参数个数,则多出的词组将被作为整体为最后一个参数接收。

read firstStr secondStr
echo "第一个参数:$firstStr; 第二个参数:$secondStr"
执行测试:
./test.sh
一 二 三 四
第一个参数:一; 第二个参数:二 三 四

6、echo输出的字符串总结

  能否引用变量 能否引用转移符 能否引用文本格式符
单引号
双引号
无引号

7、printf命令

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 执行脚本,输出结果如下所示:
姓名 性别 体重kg
郭靖 男 66.12 %d %s %c %f 格式替代符详解:
d: Decimal 十进制整数 -- 对应位置参数必须是十进制整数,否则报错!
s: String 字符串 -- 对应位置参数必须是字符串或者字符型,否则报错!
c: Char 字符 -- 对应位置参数必须是字符串或者字符型,否则报错!
f: Float 浮点 -- 对应位置参数必须是数字型,否则报错! %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。

二、单引号、双引号、反引号区别

一、单引号(‘’)

str='this is a string'
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行)

二、双引号(“”)

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符

三、反引号(``)

命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置。
shell中有两种方法作命令替换:把shell命令用反引号或者$(...)结构括起来,
其中,$(...)格式受到POSIX标准支持,也利于嵌套。
echo The date and time is `date`
echo The date and time is $(date)

三、变量与环境变量

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

1、PATH
PATH就是标准环境变量其中之一。查看变量PATH包含:

echo $PATH

如果需要在PATH中添加一条新路径,可以使用:

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

2、LD_LIBRARY_PATH
LD_LIBRARY_PATH也是Linux环境变量名之一,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。

假设我们要将myapp安装到/opt/myapp,它的二进制文件在bin目录中,库文件在lib目录中。
需要在LD_LIBRARY_PATH中添加一条新路径,可以使用: export LD_LIBRARY_PATH=/opt/myapp/lib;$LD_LIBRARY_PATH

3、获得字符串长度 可以用下面的方法获得变量值的长度:

var=12345678901234567890
echo ${#var}

4、识别当前所使用的shell 可以用下面的方法获知当前使用的是哪种shell:

echo $SHELL
echo $0

5、检查是否为超级用户
UID是一个重要的环境变量,可以用于检查当前脚本是以超级用户还是以普通用户的身份运行的。

echo $UID(root用户的UID是0)

四、Shell 进行数学运算

在Bash shell环境中,可以利用let、(( ))和[]执行基本的算术操作。而在进行高级操作时, expr和bc这两个工具也会非常有用。
1、以下这些方法只能用于整数运算,而不支持浮点数。举例:

#!/bin/bash
no1=4;
no2=5;
let result=no1+no2 //let命令可以直接执行基本的算术操作
echo $result
result1=$[ no1+no2 ] //操作符[]的使用方法和let命令类似
echo $result1
result2=$((no1 +50 )) //使用(())时,变量名之前需要加上$
echo $result2
result3=`expr 3 + 4`
echo $result3
result4=$(expr $no1 + 5) //expr同样可以用于基本算术操作
echo $result4

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

#!/bin/bash
echo "4 * 0.56" |bc
no=54
result=`echo "$no *1.5" |bc`
echo $result
echo "scale=2;39/8" | bc //设定小数精度
no1=100
echo "obase=2;$no1" |bc //转换2进制
no2=1100100
echo "obase=10;ibase=2;$no2" |bc //转换10进制
echo "sqrt(100)" | bc //计算平方根
echo "10^10" |bc //计算平方

五、重定向及文件描述符

重定向一般通过在命令间插入特定的符号来实现。如下所示:

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

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

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

(2) 将文本追加到目标文件中,看下面的例子:

$ echo "This is sample text 2" >> temp.txt

(3) 查看文件内容:

$ cat temp.txt
This is sample text 1
This is sample text 2

文件描述符是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。最常见的文件描述符是stdin、stdout和stderr。

我们甚至可以将某个文件描述符的内容重定向到另一个文 件描述符中。下面给出一些对文件描述符进行操作和重定向的例子。

文件描述符是与某个打开的文件或数据流相关联的整数。文件描述符0、1以及2是系统预留的。
0 —— stdin(标准输入)
1 —— stdout(标准输出)
2 —— stderr(标准错误)
下面的命令会将stderr文本打印到屏幕上,而不是文件中(而且因为并没有stdout 的输出,所以out.txt没有内容):

ls + > out.txt
ls: cannot access +: No such file or directory

下面的命令中,我们将stderr重定向到out.txt:

ls + 2> out.txt #正常运行

你可以将stderr单独重定向到一个文件,将stdout重定向到另一个文件:

cmd 2>stderr.txt 1>stdout.txt

还可以利用下面这个更好的方法将stderr转换成stdout,使得stderr和stdout 都被重定向到同一个文件中:

cmd 2>&1 output.txt
或者这样:
cmd &> output.txt

(4)将脚本内部的文本块进行重定向
有时候,我们需要对文本块(多行文本)进行重定向,就像对标准输入做的那样。考虑一个特殊情况:源文本就位于shell脚本中。一个实用的例子是向log文件中写入头部数据,可以按照下面的方法完成:

#!/bin/bash
cat<<EOF>log.txt
LOG FILE HEADER
This is a test log file
Function: System statistics
EOF

在cat <<EOF>log.txt与下一个EOF行之间的所有文本行都会被当做stdin数据。log.txt文件的内容打印如下:

LOG FILE HEADER
This is a test log file
Function: System statistics

六、数组

数组是shell脚本非常重要的组成部分,它借助索引将多个独立的数据存储为一个集合。普通数组只能使用整数作为数组索引。
Bash也支持关联数组,它可以使用字符串作为数组索引。
在很多情况下,采用字符串式索引更容易理解,这时候关联数组就派上用场了。在这里,我们会看到普通数组和关联数组的用法。

(1)定义数组的方法有很多种。可以在单行中使用一列值来定义一个数组:

array_var=(1 2 3 4 5 6) #这些值将会存储在以0为起始索引的连续位置上

另外,还可以将数组定义成一组“索引-值”:

array_var[0]="test1"
array_var[1]="test2"
array_var[2]=“test3"

(2) 打印出特定索引的数组元素内容:

echo ${array_var[0]}
结果:test1
index=2
echo ${array_var[$index]}
结果:test3

(3) 以清单形式打印出数组中的所有值:

echo ${array_var[*]}
结果:test1 test2 test3
也可以这样使用:
echo ${array_var[@]}
结果:test1 test2 test3

(4) 打印数组长度(即数组中元素的个数):

 echo ${#array_var[*]}
结果: 3

七、使用别名

alias 的基本使用方法为:
alias 新的命令='原命令 -选项/参数’
直接输入 alias 命令会列出当前系统中所有已经定义的命令别名。

(1) 基本使用,例如:

alias l=‘ls -lsh’
将重新定义ls命令,现在只需输入l就可以列目录了。

(2) alias命令的作用只是暂时的。一旦关闭当前终端,所有设置过的别名就失效了。为了使别名设置一直保持作用,可以将它放入~/.bashrc文件中。因为每当一个新的shell进程生成时,都会执行 ~/.bashrc中的命令:

 echo 'alias  l=“ls -lsh”’>> ~/.bashrc

(3) 如果需要删除别名,只用将其对应的语句(如果有的话)从 ~/.bashrc中删除, 或者使用unalias命令。


八、获取终端信息

编写命令行shell脚本时,总是免不了大量处理当前终端的相关信息,比如行数、列数、光标、位置、密码字段等。这则攻略将帮助你学习如何采集和处理终端设置。

 获取终端的行数和列数: tput cols 、 tput lines
 打印出当前终端名: tput longname
 将光标移动到坐标(100,100)处: tput cup 100 100
 设置终端背景色: tput setab n (其中:n可以在0到7之间取值)
 设置文本前景色: tput setaf n (其中:n可以在0到7之间取值)
 设置文本样式为粗体: tput bold
 设置下划线的起止: tput smul 、tput rmul
 删除从当前光标位置到行尾的所有内容: tput ed


九、获取、设置日期和延时

纪元时被定义为从世界标准时间1970年1月1日0时0分0秒起至当前时刻的总秒数,不包括闰秒。当计算两个日期或两段时间的差值时,纪元时很有用处。你可以得出两个特定时间戳的纪元时间,并计算出两者之间的差值,由此就能知道两个日期之间相隔了多少秒。

 
 

我们能够以多种格式打印日期,也可以在命令行中设置日期。
(1) 读取日期:

$ date
Tue Mar 13 23:24:16 PDT 2018

(2) 打印纪元时:

$ date +%s
1521008675

(3) 从给定格式的日期串中得出对应的纪元时:--date用于提供日期串作为输入

date --date "Thu Nov 18 08:07:21 IST 2018" +%s

(4)将日期串作为输入能够用来获知给定的日期是星期几。

date --date "Mar 14  2018" +%A

(5)按照你的选择打印出对应格式的日期。

date "+%d %B %Y”

(6)我们需要检查一组命令所花费的时间,可以使用以下代码:

#!/bin/bash
start=$(date +%s)
ls;
pwd;
sleep 3
end=$(date +%s)
diff=$(( end - start))
echo Time taken to execute commands is $diff seconds.

(7)编写以循环方式运行的监视脚本时,设置时间间隔是必不可少的。让我们来看看如何生成延时。

#!/bin/bash
echo -n Count:
tput sc //tput sc存储光标位置
count=0; //变量count初始化为0,随后每循环一次便增加1
while true;
do
if [ $count -lt 4 ]; //-lt 小于
then
let count++;
sleep 1;
tput rc //恢复光标位置的命令
tput ed //清除从当前光标位置到行尾之间的所有内容,使得旧的count值清除并写入新值
echo -n $count;
else exit 0;
fi
done

以上,未完待续~~

 

Shell学习笔记一的更多相关文章

  1. SHELL学习笔记----IF条件判断,判断条件

    SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外.  if list then           do something here   ...

  2. shell学习笔记

    shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...

  3. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

  4. shell学习笔记汇总

    1.shell脚本中函数使用 函数定义在前,调用在后,顺序反了就没有效果了.函数调用为:函数名 参数列表 函数内部通过以下变量访问函数的参数:shell脚本函数中: $0: 这个脚本的名字 $n: 这 ...

  5. shell 学习笔记2-shell-test

    一.字符串测试表达式 前面一篇介绍:什么是shell,shell变量请参考: shell 学习笔记1-什么是shell,shell变量 1.字符串测试表达式参数 字符串需要用""引 ...

  6. SHELL学习笔记三

    SHELL学习笔记一 SHELL学习笔记二 SHELL学习笔记三 for 命令 读取列表中的复杂值 从变量读取列表 从命令读取值 更改字段分隔符 用通配符读取目录 which 使用多个测试命令 unt ...

  7. 【转】shell学习笔记(一)——学习目的性、特殊字符、运算符等

    1 学习shell的目的性 写之前我们先来搞清楚为什么要学shell,学习要有目的性 shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自动化管理,让系统管理员的工作 ...

  8. [Bash Shell] Shell学习笔记

    1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命 ...

  9. shell 学习笔记

    <Linux命令行与shell脚本编程大全>笔记   wkss 其他:http://www.cnblogs.com/pengdonglin137/p/3528303.html 一.基本命令 ...

  10. CentOS 7 之Shell学习笔记

    脚本是个永恒的话题,以前Dos下面也有Shell编程这一说的,比如说BAT文件有人写的好的话,也是瞬间速度变高大上.Linux下面这个应该更占比重了.我看到园子里有位园友做了一个Linux Shell ...

随机推荐

  1. Red5视频流服务器安装

    一.安装jre JAVA运行时下载地址: https://www.java.com/zh_CN/download/manual.jsp 安装后设置环境变量,变量值是jre的安装路径 二.安装 red5 ...

  2. centos-7 虚拟机安装图形界面

    centos-7 虚拟机安装图形界面 想到安装一个docker环境,于是拿出了以前装的虚拟机centos7,记得装完后,没进行任何配置(默认安装的是命令行界面). 配置网络 现有的虚拟机是没有办法联网 ...

  3. Deepin系统安装mysql教程及相关操作

    Deepin系统安装mysql教程及相关操作 1.安装MySQL sudo apt-get install mysql-server,期间需要输入两次密码,root账户的密码. sudo apt-ge ...

  4. Java中实现多线程继承Thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  5. c++のurlmon实现下载文件并进度回调

    主文件: #include "stdafx.h" #include <UrlMon.h> #pragma comment(lib, "urlmon.lib&q ...

  6. VC++界面编程之--仿Facebook透明登录窗体

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/renstarone/article/details/27642765 1. 开发工具:VC++ DU ...

  7. css3属性中background-clip与background-origin的用法释疑

    困惑在哪里? background-clip 与 background-origin是css3中引入的两个跟元素背景相关的属性,它们有相同的可选值,即border.padding.content 三种 ...

  8. Random.nextInt()替换Math.random()

    在项目中使用哪个随机数 文章参考 http://liukai.iteye.com/blog/433718 今天用了find bugs后查出来了个问题 Google了下 发现 Random.nextin ...

  9. k8s部署spring-boot项目失败

    现象:spring-boot项目启动到某个地方停止,然后容器重启 解决:扩大内存和核心数

  10. QT pro文件详细写法+实例

    很多的初学者都没有注意pro 文件的内容 今天简单的介绍一下 这个文件主要内容 TEMPLATE:这个变量是用来定义你的工程将被编译成什么模式.如果没有这个设置,系统将默认编译为application ...