shell是介于操作系统和使用者之间的接口。
对用户而言可以屏蔽系统的负责性。
对于系统而言可以防止用户的误操作或是有意的破坏。
使用较广的shell有标准的Bourne shell (sh)、Korn Shell(ksh)、C shell (csh)、Bourne Again Shell(bash)等。
查看当前环境所用shell:echo $SHELL
shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。
本质上,shell 脚本是命令行命令简单的组合到一个文件里面。Shell基本上是一个命令解释器,类似于DOS下的command.com。它接收用户命令,然后调用相应的应用程序。
进入shell脚本编程:
1.在一个目录下创建一个hello.sh文件
touch hello.sh
2.使用vi编辑器打开hello.sh
vi hello.sh
3.按i键进入编辑模式
敲入:
#!/bin/sh /*shell脚本固定第一行,告诉系统这个是shell文件 */
#hello.sh /*shell的文件名称*/
#To show hello to somebody /*功能部分 */
echo -n“Enter Your Name:”
read NAME
echo “Hello,$NAM!”
4.保存推出vi
按esc键,按shift+冒号键,wq
5.给刚刚创建shell文件授权
chmod u+x hello.sh
6.执行脚本
./hello.sh
查看用户身份
whoami
切换用户
su 用户名
文件查找使用find
如:
文件内容查找使用grep
如:grep "aa" hello.sh
文件访问权限
一个文件已经创建就有3种访问形式
r表示文件刻度对应的八进制表示为4 w表示文件可写可以删除对应的八进制是2 x表示如果是程序的话表示可以执行对应的八进制是1
文件的类型
前缀 类型 前缀 类型
— 普通文件 l 链接(link)文件
b 块(block)设备文件 p 命名管道(pipe)文件
c 字符(character)设备文件 s 本地套接口(socket)
d 目录(directory)
一个文件由1个类型和9个权限位来描述,9个权限位分为3组,每组3个权限位,具体表示如下所示:
-(类型)
rwx(u:user文件的属主)
rw-(g:group属主所在的组,属组)
r-x(o:other 其他用户)
a(以上三种人)
改变文件或是目录的权限
chmod [u/g/o/a][+/-/=] [权限] 文件或是目录名
+表示添加权限
-表示去掉指定权限
=表示清除之前的权限并赋予新设定的权限
chmod允许8进制符合作为模式,改变权限
chmod permissionCode fileName/dicName
- rwx rw- r-x
该文件所具有的权限为
7(rwx)6(rw)5(rx)即765
r用4表示
w用2表示
x用1表
chmod实例
假设hello.c最初拥有rwxrwxrwx的权限
依次执行一下的命令:
命令 结果 含义
chmod a-x hello.c rw-rw-rw 收回所有用户的执行权限
chmod go-w hello.c rw-r--r-- 收回同组用户和其他用户的写权限
chmod g+w hello.c rw-rw-r-- 赋予同组写的权限
chmod a= hello.c --------- 清除所有权限
chmod 666 hello.c rw-rw-rw- 赋予所有用户和写的权限
chmod 644 hello.c rw-r--r-- 赋予属主读、写权限,其他用户和属组读的权限
chmod 700 hello.c rwx------ 赋予属主读、写、执行的权限
chmod 660 hello.c rw-rw---- 赋予属主读写权限,同组用户读写权限
改变文件目录的属主
改变文件目录的属主
chown Owner fileName/dicName
如:chown dev hello.c
改变文件或目录的属组
chown Group fileName/dicName
如:chown devGroup hello.c
改变文件或是目录的属主和属组
chown owner:group fileName/dicName
如:chwon cloud:cloud hello.c
变量
保存暂时信息
变量一般都用大写字母表示
使用echo可以显示单个变量的取值,要在变量前加$
如:
USER="haison"
echo $USER
如果设置变量时,不想改变其值,可以将变量设置为只读,只要在变量前加上readonly
使用set命令可以显示本地所有定义的shell变量
unset 变量名:清除变量的定义
变量的分类:本地变量(用户自定义的变量)、环境变量(用于所有用户定义的变量,用于用户进程前必须使用export导出)、位置变量:$0(脚本名),$1-$9:脚本参数、
特定变量:脚本运行时的一些相关信息。
$# 传递到脚本的参数个数
$* 传递到脚本的参数,与位置变量不同,此选项参数可超过9个
$$ 脚本运行时当前进程的ID号,常用作临时变量的后缀,如haison.$$
$! 后台运行的(&)最后一个进程的ID号
$@ 与$#相同,使用时加引号,并在引号中返回参数个数
$- 上一个命令的最后一个参数
$? 最后命令的退出状态,0表示没有错误,其他任何值表明有错误
示例:
#!/bin/sh
#VarTest.sh
#To test the variables
USER=haison
echo "Hello,$USER,the output of this script are as follows:"
echo "The script name is :`basename $0`"
echo "The first param of the script is :$1"
echo "The second param of the script is :$2"
echo "The tenth param of the script is :$10"
echo "All the params you input are :$*"
echo "The number of the params you input are:$#"
echo "The process ID for this script is :$$"
echo "The exit status of this script is :$?"
文件状态测试
-d 目录 -r 可读
-f 常规文件 -w 可写
-L 符号连接 -x 可执行
-s 文件长度大于0,非空 -u 文件有suid位设置
示例: [ -s haison.c ] 0表示成功,其他为失败,下同。
逻辑操作符
-a 逻辑与(and),操作符两边均为真,结果为真,否则为假。
-o 逻辑或(or),操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真,反之。
示例: [ -r haison.c –a –w hai.c
字符串测试
= 两个字符串相等 -z 空串
!= 两个字符串不相等 -n 非空串
示例:[ -z $SHELL ]
数值测试
-eq 数值相等(equal to) -lt 第一个数小于第二个数(less than)
-ne 数值不相等(not equal to) -le 第一个数小于等于第二个数
-gt 第一个数大于第二个数(greater than) -ge 第一个数大于等于第二个数
示例:[ “10” -eq “12” ]
控制结构
选择结构:
if语句: if then else 提供条件测试
case 语句:允许匹配模式、单词或值
循环结构:
for:每次依次处理列表内的信息,直至循环耗尽。
until:不常用。条件在循环末尾,至少执行一次。
while:条件在循环头部。
示例
#!/bin/sh
#ifTest
#to show the method of if
echo -e "Enter the first integer:\c"
read FIRST
echo -n "Enter the second integer:"
read SECOND
if [ "$FIRST" -gt "$SECOND" ]
then
echo "$FIRST is greater than $SECOND"
elif [ "$FIRST" -gt "$SECOND" ]
then
echo "$FIRST is less than $SECOND"
else
echo "$FIRST is equal to $SECOND"
fi
示例
#!/bin/sh
#caseTest
#to test the method of case
USER=`whoami`
case $USER in
root)echo “You can do all the operations”
;;
Dave)echo "You can do some operations”
;;
*)echo "Sorry,you can not do anything"
;;
esac
#!/bin/sh
#forTest
#to test the method of for
COUNTER=0
for FILES in *
do
COUNTER=`expr $COUNTER + 1`
done
echo "There are $COUNTER files in `pwd` "
示例
#!/bin/sh
#untilTest
#to test the mothod of until
IS_ROOT=`who|grep root`
until [ "IS_ROOT" ]
do
IS_ROOT=`who|grep root`
sleep 5
done
echo "Watch it.root in!"
示例
#!/bin/sh
#whileTest
#to test the method of while
COUNTER=0
while [ $COUNTER -lt 10 ]
do
echo $COUNTER
COUNTER=`expr $COUNTER + 1`
done
while read LINE
do
echo $LINE
done < names.txt
函数
格式
函数名 ()
{
命令
}
所有函数在使用前必须定义,这意味着必
须将函数放在脚本开始部分,直至shell解释
器首次发现它,才可以使用。
调用函数仅使用其函数名即可,要传给函
数的变量跟在函数后面。
函数里面定义的变量以下划线(_)开始。
函数可以放在同一个文件中作为一段代
码,也可以放在只包含函数的单独文件中,文
件也必须以#!/bin/sh开头。
#!/bin/sh
#funTest
#to test the function
DATE=`date`
Hello()
{
echo “Hello,today is $DATE”
}
Hello
#!/bin/sh
#funTest
#to test the function
. ./Hello
Hello
注释和管道线
shell脚本中以“#”开头的正文行表示注释.
#!/bin/bash
#This script is a test! 这些均是注视,第一行必须有
管道线由|表示,前一个命令的输出正是后一个命令的输入
例如:
[root@localhost pro]$ls -l |wc -l
命令与&&表示第一个命令执行成功第二个命令才会执行
命令||
内部变量
$# ——传送给shell程序的位置参数的数量
$?——最后命令的完成码或者在shell程序内部执行的shell程序(返回值)
$0——shell程序的名称
$*——调用shell程序时所传送的全部参数成的单字符串
环境变量
(1)HOME:用户目录的全路径名。 //对应/home/cloud下,每个人可以分别设置
(2)LOGNAME:即用户的注册名,由Linux自动设置。
(3)MAIL:用户的系统信箱的路径。
(4)PATH:shell从中查找命令的目录列表
正则表达式
(2)?(问号),它匹配任意一个字符。
(3)[ ](一对方括号),其中有一个字符组。其作用是匹配该字符组所限定的任何一个字符。
(4)!(惊叹号),如果它紧跟在一对方括号的左方括号[之后,则表示不在一对方括号中所列出的字符。
(5)^(幂次方号),只允放在一行的开始匹配字符串。
(6)$(美元号),只在行尾匹配字符串,它放在匹配单词的后面。
* 0次或是多次
+ 1次或是多次
? 0次会1次
字符串比较
s1=s2:如果s1等于s2,则测试条件为真;
s1!=s2:如果s1不等于s2,则测试条件为真;
-n s1:如果字符串s1长度大于0,则测试条件为真;
-z s1:如果字符串s1长度等于0,则测试条件为真
数字比较
n1 –eq n2 :如果n1等于n2,则测试条件为真;
n1 –ne n2:如果n1不等于n2,则测试条件为真;
n1 –gt n2:如果n1大于n2,则测试条件为真;
n1 –ge n2: 如果n1大于或等于n2,则测试条件为真;
n1 –lt n2: 如果n1小于n2,则测试条件为真;
n1 –le n2:如果n1小于或者等于n2,则测试条件为真。
文件条件测试
(3)文件操作符
-r 文件名:如果文件存在且是用户可读的,则测试条件为真;
-w 文件名:如果文件存在且是用户可写的,则测试条件为真;
-x 文件名:如果文件存在且是用户可执行的,则测试条件为真;
-d 文件名:如果文件存在且是目录文件,则测试条件为真;
-f 文件名:如果文件存在且是普通文件,则测试条件为真;
-b 文件名:如果文件存在且是块文件,则测试条件为真;
-c 文件名:如果文件存在且是字符文件,则测试条件为真;
-s 文件名:如果文件存在且长度大于0,则测试条件为真;
使用yum搜索文件
yum search g++
使用yum按照软件
yum install g++
编译
进入应用目录后 make
按照编译后的文件
make install
为sh文件传入参数的方法
例:test.sh
#!/bin/sh
echo $1
执行
sh test.sh aaa
分享到:
相关推荐
B shell与 C shell的区别 B shell和C shell都是Linux操作系统中的shell类型,它们之间存在一些关键的区别。 首先,让我们从B shell开始。B shell,全称为Bourne shell,是UNIX最初使用的shell。它在每种UNIX上都...
本手册涵盖了 Shell 编程的基础知识,包括 Shell 概述、Shell 解析器、Shell 脚本入门、Shell 中的变量等。 Shell 概述 Shell 是一种命令行接口,允许用户与操作系统进行交互。学习 Shell 编程可以让开发者更好地...
资源名称:Linux Shell脚本学习基础视频资源目录:【】11a00d99b60c4e2eba3440b8aa3a6bdd【】linux_shell脚本编程_01认识shell,如何编写shell脚本和执行【】linux_shell脚本编程_02vivim简单的常用操作【】linux_...
**C语言中文网shell脚本教程** 这是一份关于Shell脚本编程的离线学习资料,包含了一系列HTML文件,旨在帮助用户深入理解并掌握Linux Shell脚本编程技术。以下是其中涉及的一些关键知识点: 1. **Shell命令的本质**...
提问: 我想要知道运行中脚本子shell的进程id。我该如何在shell脚本中得到PID。 当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为...
Windows Shell 编程.pdf 看过一些对windows 外壳的扩展程序,在使用上一般都是直接利用windows的外壳API做一些工作,因为外壳操作需要一些比较专业的知识,因此,大部分编程人员特别是使用集成编程环境的程序人员对...
此外,Shell并非固定不变的,用户可以根据个人需求选择不同的Shell类型,常见的Shell包括Bourne Shell (`sh`)、Bourne-Again Shell (`bash`)、C Shell (`csh`)、T C Shell (`tcsh`) 和 Korn Shell (`ksh`)等。...
【shell.efi 启动】是一种在UEFI(统一可扩展固件接口)系统中启动计算机的方法。在现代计算机上,UEFI替代了传统的BIOS,提供了更高效、功能更丰富的固件接口。shell.efi文件是UEFI环境中的一种可执行文件,它充当...
"大数据技术之Shell" 本资源是关于大数据技术中的 Shell 技术的详细文档,涵盖了 Shell 的概述、Shell 脚本入门、变量等方面的知识点。 章节 1:Shell 概述 Linux 提供的 Shell 解析器有多种,包括 /bin/sh、/bin...
《LINUX与UNIX Shell编程指南》是一本专为初学者设计的shell编程教程,它深入浅出地介绍了在Linux和UNIX系统中如何使用Shell进行高效自动化任务处理。Shell编程是Linux和UNIX系统中的核心技术,它允许用户通过命令行...
Linux Shell是Linux操作系统中的一种命令解释器,它提供了一个用户与操作系统内核交互的界面,使得用户可以通过文本命令行执行各种操作。Shell脚本则是一种编程语言,它允许用户编写包含一系列命令的程序,实现自动...
### Visual Studio 2013 Shell 知识点解析 #### 一、Visual Studio Shell 概述 在软件开发领域,Visual Studio Shell 是一个极为重要的工具。它由微软推出,旨在为开发者提供一个灵活且可扩展的基础平台。通过这个...
为了方便地与这些设备交互并进行调试,开发人员常常会实现一个控制台shell,它允许通过串口或其他通信接口发送命令到MCU并接收响应。本文将深入探讨如何在MCU上运行的简单控制台shell及其相关知识点。 **控制台...
"shell脚本与Makefile区别" shell 脚本和 Makefile 是两个不同的工具,它们都用于自动化构建和编译过程,但是它们有很大的不同之处。本文将详细介绍 shell 脚本和 Makefile 的区别。 首先,shell 脚本和 Makefile ...
Linux中的Shell是一个至关重要的组成部分,它是用户与操作系统交互的接口,扮演着命令解释器的角色。在Linux系统中,默认的Shell通常是Bash(Bourne-Again SHell),它继承了Bourne shell的功能并增加了许多扩展特性...
### shell 13问知识点详解 #### 一、Shell是什么? **知识点1:Shell的定义与作用** - **定义**:Shell是一种用户与计算机系统之间的交互界面,它充当了一个命令解释器的角色,能够将用户的命令转化为系统能识别的...
Shell是Unix和Linux操作系统中的命令解释器,它提供了一个用户与操作系统内核交互的界面,允许用户通过输入命令来执行系统功能。Shell不仅是一个命令行接口,还是一个强大的编程语言,用户可以编写脚本来自动化一...
`Shell32.dll`是Windows Shell的主要组件,提供了对桌面环境、文件管理、快捷方式、文件属性以及各种系统级功能的访问接口。通过`Interop.Shell32`,开发者可以方便地在应用程序中实现诸如打开文件、创建快捷方式、...