`

Shell

阅读更多
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
分享到:
评论

相关推荐

    shell 编程指南pdf

    初学shell 入门好书!!!! 目 录 译者序 前言 第一部分 shell 第1章 文件安全与权限 1 1.1 文件 1 1.2 文件类型 2 1.3 权限 2 1.4 改变权限位 4 1.4.1 符号模式 4 1.4.2 chmod命令举例 5 1.4.3 绝对模式 5 1.4.4 ...

    LinuxShell脚本学习基础视频

    资源名称:Linux Shell脚本学习基础视频资源目录:【】11a00d99b60c4e2eba3440b8aa3a6bdd【】linux_shell脚本编程_01认识shell,如何编写shell脚本和执行【】linux_shell脚本编程_02vivim简单的常用操作【】linux_...

    Shell脚本中获取进程ID的方法

    提问: 我想要知道运行中脚本子shell的进程id。我该如何在shell脚本中得到PID。 当我在执行shell脚本时,它会启动一个叫子shell的进程。作为主shell的子进程,子shell将shell脚本中的命令作为批处理运行(因此称为...

    B shell与 C shell的区别

    B shell与 C shell的区别 ; B shell的详解和C shell 的详解

    Linux 下 Shell的工作原理

    shell是用户和Linux操作系统之间的接口。 什么是shell  Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。  shell是用户和Linux内核之间的...

    Linux Shell编程实验

    Shell编程实验 一、实验目的 了解 Shell 的作用和主要分类。 了解 Bash的一般语法规则。 练习编写简单的shell程序。 二、实验内容 1.Shell变量的定义及其使用。 2.位置参数和环境变量。 3.Shell中的特殊字符。 4....

    实验一shell实验报告

    实验1: SHELL编程 实验目的 熟悉linux常用命令,为以后的实验打下良好基础; 熟悉vi编辑器的使用; 了解Shell程序的语法规则,能编写简单的Shell程序。 实验内容 1、使用常用的Linux命令,主要包括如下命令: date,...

    01_shell编程.docx

    Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多...

    shell从入门到精通pdf

    文档名称 Shell 从入门到精通 腾讯课堂直播 http://opsdev.ke.qq.com 博客 http://lizhenliang.blog.51cto.com GitHub https://github.com/lizhenliang/Shell-Python-Document QQ 技术群 323779636(Shell/...

    k-shell分解算法

    K-shell 分解方法给出了节点重要性的一种粗粒化的划分。 其基本思想如下,假设边缘节点的 K-shell值为 1,然后往内一层层进入网络的核心,先去除网络 中度值等于 1 的所有节点以及连边。 若剩下的节点里面,仍有度值...

    Shell脚本中让进程休眠的方法(sleep用法)

    有时候写Shell的脚本,用于顺序执行一系列的程序。 有些程序在停止之后并没能立即退出,就例如有一个 tomcat 挂了,就算是用 kill -9 命令也还没瞬间就结束掉。 这么如果 shell 还没等其退出就接着执行下一行,这么...

    sshshell.zip

    sshshell ssh shell 服务器 远程连接 FTP for mac ssh shell 服务器 远程连接

    250个shell脚本

    Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用大量系统内部的功能来...

    Linux中Shell截取某行某列信息

    背景:执行shell命令,抓取shell返回信息中的所需信息,已udhcpc为例获取DNS的地址。 暂不作处理,执行udhcpc。 使用grep过滤掉无用信息,执行 udhcpc | grep “DNS” 使用sed抓取第二行,-n ‘2p’代表第二行,-n...

    shell高级编程 shell的经典教程

    shell 是操作系统的最外层。shell 合并编程语言以控制进程和文件,以及启动和控制其它程序。shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。  ...

    绝版经典 LINUX与UNIX SHELL编程指南 PDF 高清版 [16.3M]

    shell是一种完整的编程语言,易学易用;shell脚本可以使烦人的手工作业自动化,使你的工作变得简单、轻松!本书通过各种实用的系统管理小技巧和趣味脚本代码,详尽地介绍了shell编程各个不同的方面。学完本书后,你...

    shell 编程shell 编程

    shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程shell 编程...

    mysql-shell-8.0.18-windows-x86-64bit.zip

    mysql-shell-8.0.18-windows-x86-64bit.zip MySQL Shell is an advanced command-line client and code editor for MySQL. In addition to SQL, MySQL Shell also offers scripting capabilities for JavaScript ...

    shell shell练习 shell入门

    shell shell练习 shell入门 shell shell练习 shell入门

    Linux shell数组循环的实例详解

    shell数组循环 测试shell数组,循环的例子: arr=(a b c) echo 所有的内容如下:${arr[@]} echo 数组的长度:${#arr[*]} for var in ${arr[@]} do echo 打印的内容:$var done 输出的内容如下: 以上...

Global site tag (gtag.js) - Google Analytics