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)