一、Shell

一、概念

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。不得不说,shell 的语法是相对繁杂的,之前了解的内容相对较为浅薄,结合最近学习内容更新此博客。

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。业界所说的 shell 通常都是指 shell 脚本。由于习惯的原因,简洁起见,本文出现的 “shell编程” 都是指 shell 脚本编程,不是指开发 shell 自身。

1.1 Shell 环境

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 解释器种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序

1.2 Shell 实例

编写 shell 脚本,并命名为 hello.sh

#!/bin/bash

# 在终端输出 Hello World!
echo "Hello World!"
  1. #!:告诉系统其后路径所指定的程序即是解释此脚本文件的 脚本解释器。这是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
  2. #:以 # 开头的句子表示注释,直到这一行的结束 。
  • 赋予执行权限:

    chmod +x hello.sh
    
  • 运行

    ./hello.sh
    

3 变量

在其他编程语言中必须使用变量。在shell编程中,所有的变量都由字符串组成,并且不需要对变量进行声明。要赋值给一个变量,可以这样写:
#!/bin/sh
#对变量赋值:
a=”hello world”
#现在打印变量a的内容:
echo “A is:”拆分组合成功
echo $a

有时候变量名很容易与其他文字混淆,比如:
num=2
echo “this is the $numnd”
这并不会打印出”this is the 2nd”,而仅仅打印”this is the “,因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是

num变量:
num=2
echo “this is the ${num}nd”
这将打印: this is the 2nd

4 环境变量

由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。

5 Shell命令和流程控制

在shell脚本中可以使用三类命令:

1)Unix 命令:

虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。
常用命令语法及功能
echo “some text”: 将文字内容打印在屏幕上

ls: 文件列表

wc –l filewc(计算文件行数) -w filewc (计算文件中的单词数)-c file(计算文件中的字符数):

cp sourcefile destfile: 文件拷贝

mv oldname newname : 重命名文件或移动文件

rm file: 删除文件

grep ‘pattern’ file: 在文件内搜索字符串比如:grep’searchstring’ file.txt

cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令

cat file.txt: 输出文件内容到标准输出设备(屏幕)上

file somefile: 得到文件类型

read var: 提示用户输入,并将输入赋值给变量

sort file.txt: 对file.txt文件中的行进行排序

uniq: 删除文本文件中出现的行列比如: sortfile.txt | uniq

expr: 进行数学运算 Example: add 2 and 3 expr 2 “+” 3

find: 搜索文件比如:根据文件名搜索find .-name filename –print

tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile

basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux

dirname file: 返回文件所在路径比如:dirname/bin/tux将返回 /bin

head file: 打印文本文件开头几行

tail file : 打印文本文件末尾几行

sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus替换为 LinuxFocus :cat text.file | sed ’s/linuxfocus/LinuxFocus/’ >newtext.fileawk:

awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。
catfile.txt | awk -F, ‘{print $1 “,” $3}’这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerryMiller, 22, USA命令输出结果为:Adam Bor, IndiaKerry Miller, USA

2) 概念: 管道, 重定向和 backtick

管道 (|) 将一个命令的输出作为另外一个命令的输入。
grep “hello” file.txt | wc –l
在file.txt中搜索包含有”hello”的行并计算其行数。
在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。

重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
> 写入文件并覆盖旧文件
>>加到文件的尾部,保留旧文件内容。

反短斜线
使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。
命令:
find . -mtime -1 -type f -print
用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下linux 脚本:

#!/bin/sh
#The ticks are backticks () not normal quotes (‘): tar -zcvf lastmod.tar.gz find . -mtime -1 -type f -print`

3) 流程控制

1.if
“if” 表达式
如果条件为真则执行then后面的部分:
if ….; then….
elif ….; then….
else….
fi
大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…

通常用” [ ] “来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
[ -f “somefile” ] :判断是否是一个文件
[ -x “/bin/ls” ] :判断/bin/ls是否存在并有可执行权限
[ -n " v a r " ] :判断 var" ] :判断 var"]:判断var变量是否有值
[ “ a " = " a" = " a"="b” ] :判断 a 和 a和 ab是否相等
执行man test可以查看所有测试表达式可以比较和判断的类型。
直接执行以下脚本:

#!/bin/sh
if [ “$SHELL” = “/bin/bash” ]; then
echo “your login shell is the bash (bourne againshell)”
else
echo “your login shell is not bash but $SHELL”
fi

变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。
快捷操作符
熟悉C语言的朋友可能会很喜欢下面的表达式:

[ -f “/etc/shadow” ] && echo “This computer uses shadow passwors”
这里 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。

也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。同样或操作(||)在shell编程中也是可用的。这里有个例子:

#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r "KaTeX parse error: Expected '}', got 'EOF' at end of input: …o “Can not readmailfolder” ; exit 1; }
echo “$mailfolder has mail from:”
grep “^From ” $mailfolder
该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的”From” 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:

◆打印错误信息

◆退出程序

我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及.不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值