zoukankan      html  css  js  c++  java
  • Shell脚本系列教程二: 开始Shell编程

    Shell脚本系列教程二: 开始Shell编程

    2.1 如何写shell script?

    (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器;

    (2) 脚本写好之后, 要给脚本设置可执行权限: 语法为: chmod  [option]  mode  script-name

    $ chmod +x script-name  # 对所有用户(a, 默认)
    $ chmod 775 script-name

    这里, 775这3个数字分别表示此文件对于用户(u), 组(g), 其他用户(o)的权限设置, 比如: 第一个7,二进制为111,表示分别表示赋予了用户此文件的读, 写, 执行权限; 

    who: u(用户), g(组), o(其他), a(所用用户, 默认);  opcode: +(增加权限), -(删除权限), =(重新分配权限);  permission: r(读权限), w(写权限), x(执行权限), s(设置用户ID号), t(粘着位)

    1 $ chmod u+x file      # 给此file的用户添加执行权限
    2 $ chmod 751           # 给此file的用户读写执行权限,file所在组读,执行权限,其他用户执行权限
    3 $ chmod u=rwx,g=rx,o=x file  # 和上一条语句含义相同
    4 $ chmod =r file           # 给所有用户分配读权限(默认的用户为a,这里就是默认了)
    5 $ chmod 444 file        # 和上条语句完全相同
    6 $ chmod a-wx,a+r file  # 同上条语句, - 表示去除权限
    7 $ chmod +R u+r directory  # 递归地给directory目录下所有文件和子目录分配读的权限

    (3) 使用下面的命令来执行脚本: 

    $ bash script-name 或 $ sh script-name 或 $ ./script-name (你的终端当前路径是本脚本所在路径, 但是还是要加上"./", 这样才会从当前文件夹来找这个文件);如果只有一个.(dot)表示在当前的shell里面执行给定的文件: 语法为: . command-name (可以参考[2]).

    下面, 写下自己的第一个shell脚本: 命名为first

    $ clear
    $ echo "Hello World"

    对脚本进行保存之后,你可能会使用下面的命令来执行脚本:

    $ ./first

    这种方式不得行,因为这个脚本现在还没有执行权限,要给脚本加上执行权限方可执行: 屏幕会被清空,Hello World将会被打印到屏幕上.

    $ chmod 775 first
    $ ./first 
    脚本命令 含义
    clear 清空屏幕
    echo "Hello World" 在屏幕上输出信息或者变量的值,这里使echo命令的一般使用方法: echo "Message"

    练习: 写如下的脚本, 保存然后执行, 观测输出

    ginfo

    1 clear
    2 echo "Hello $USER"
    3 echo "Today is c";date
    4 echo "Number of user login :c";who | wc -l
    5 echo "Calendar"
    6 cal
    7 exit 0

     输出:

    Hello wang
    Today is c
    2016年 11月 04日 星期五 10:36:15 CST
    Number of user login :c
    2
    Calendar
          十一月 2016        
    日 一 二 三 四 五 六  
           1  2  3  4  5  
     6  7  8  9 10 11 12  
    13 14 15 16 17 18 19  
    20 21 22 23 24 25 26  
    27 28 29 30    

    2.2 Shell中的变量

    在Linux(Shell)中, 有两种类型的变量:

    1) 系统变量: 由Linux自定义和生成的, 都是用大写字母.

    2) 用户定义的变量(UDV): 由用户定义和生成的变量.

    一些重要的系统变量如下表所示:

    系统变量 含义
    BASH shell所在路径: 如/bin/bash, 此命令和SHELL相同
    BASH_VERSION shell的版本,如: 4.3.11(1)-release
    COLUMNS 你的终端的coloums, 如80; 我电脑上,终端最大化后, 此值变成205
    HOME 电脑的home路径, 如/home/wang
    LINES 和COLUMNS含义差不多
    LOGNAME 当前用户名称, 如wang
    OSTYPE Os类型: 如linux-gnu
    PATH 我们的路径设置
    PS1 Our prompt settings
    PWD 当前的工作路径
    SHELL shell所在路径: 如/bin/bash
    UESRNAME 当前登陆到这台PC的用户名称

    如果想要打印输出当前的home路径, 可以:

    $ echo $HOME      # 输出: /home/wang

    但是下面可以这样吗? 下面这条命令是ok的, 不会出现任何错误, 但是它会输出HOME, 而不是HOME所指代的内容, 要在HOME前面加上$才行.

    $ echo HOME    # 输出: HOME

    2.3 如何定义/输出用户定义变量

    用户定义自己的变量: 语法: variable name=value

    $ no=10   # 正确
    $ 10=no   # 错误, 值必须在等号的右侧
    $ vech=Bus  # Bus是个字符串
    $ n=10

    准则: 1)变量名的定义必须以字母或者下划线开头;2)赋值的时候,等号的左右侧都不能有空格;3)变量名对大小写敏感;4)可以定义NULL变量;5)变量名里面不能有*,?等.

    # 2) 等号的左右不能有空格
    $ n =10 n: command not found $ n= 10 10: command not found $ n = 10 n: command not found $ n=10 # 正确
    # 3)变量名对大小写是敏感的,下面这四个变量是不相同的!!
    $ no=10  
    $ No=34
    $ NO=45
    $ nO=32
    # 4) 定义NULL变量
    $ vech=
    $ vech=""
    # 5) 变量名里面不能有*
    $ a*=4 a*=4: command not found

    如何打印输出自定义变量?

    定义变量vech和n,然后打印输出(在变量名前面加上$):

    $ vech=Bus
    $ n=10
    $ echo vech
    Bus
    $ echo $n
    10
    $ echo vech # 这里没有输出vech的内容,而是把vech当做是字符串
    vech

    练习:

    1.定义变量x的值为10,并且打印到屏幕:

    $ x=10
    $ echo $x
    10

    2.定义变量xn的值为Rani,并且打印到屏幕:

    $ xn=Rani
    $ echo $xn
    Rani

    3.如何打印输出两个数:6和3之和?

    $ echo `expr 6 + 3`  # +两边有空格
    9 
    $ echo `expr 6+3`    # +两边忘记加空格了
    6+3

    4.定义两个变量x=20,y=5,打印输出x除以y的值:

    $ x=20
    $ y=5
    $ echo `expr $x / $y`    # /的两边同样要有空格

    5. 将4中的x/y的值赋值给z:

    $ z=`expr $x / $y`
    $ echo $z
    4

    2.4 echo命令

    echo命令用于显示文本或者变量的值:echo [options] [string, variables ...]

    options:

    -n 

    -e  表示在字符串中启用下面的这些制表符:

    a  发出"噔"的一声警告!

      backspace删除键

    $ echo -e "HelloBaby"
    HellBaby

    c  

     开新行

    $ echo -e "Hello
    Baby"  # 两行显示
    Hello
    Baby

     回车

     水平制表符; $ echo -e "Hello Baby" output: Hello Baby $ echo -e Hello Baby output: HellotBaby 

    \  输出一个\,前一个是转义:  echo \ 得到:

    2.5 Shell算术运算

    语法: expr op1 math-operator op2  # 1)用expr; 2)运算符两边都有空格

    $ expr 1 + 3
    4
    $ expr 2 - 1
    1
    $ expr 10 / 2
    5
    $ expr 20 % 3
    2
    $ expr 10 * 3  # 特别注意,乘号需要转义
    30
    $ echo expr 6 + 3  # 看看这个是什么原因?
    expr 6 + 3
    $ echo "expr 6 + 3"  # 看看这个是什么原因?
    expr 6 + 3
    $ echo 'expr 6 + 3'  # 看看这个是什么原因?
    expr 6 + 3
    $ echo `expr 6 + 3`  # 这个才是正确的
    9

    注意最后一条语句,正确的写法应该是:$ echo `expr 6 + 3` .注意,这里用的不是单引号,更不是双引号,而是后引号(``).当一个命令被后引号引住的时候,此命令将被执行,我们将得到它的输出.

    2.6 读语句(read)

    从键盘上读取数据存放在变量中: 语法: read var1, var2, ..., varN

    编写下面的脚本文件, 提示用户输入名字, 用户使用键盘输入名字, 存放在指定的变量中, 然后显示:

    $ vi sayH
    echo "Your first name please: "
    read fname   # 用户的输入存放在fname里面!!!
    echo "Hello $fname, Lets be friend!"

    执行下面的语句运行sayH:

    $ chmod +x sayH
    $ ./sayH

    Your first name please:
    Zhao
    Hello Zhao, Lets be friend!

    通配符


    参考文献:

    [1] Linux Shell Scripting Tutorial: http://www.freeos.com/guides/lsst/index.html

    [2] http://blog.csdn.net/mci2004/article/details/7182829

  • 相关阅读:
    codeforces 455B A Lot of Games(博弈,字典树)
    HDU 4825 Xor Sum(二进制的字典树,数组模拟)
    hdu 1800 Flying to the Mars(简单模拟,string,字符串)
    codeforces 425A Sereja and Swaps(模拟,vector,枚举区间)
    codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)
    HDU 4148 Length of S(n)(字符串)
    codeforces 439D Devu and Partitioning of the Array(有深度的模拟)
    浅谈sass
    京东楼层案例思维逻辑分析
    浅谈localStorage和sessionStorage
  • 原文地址:https://www.cnblogs.com/zhao441354231/p/6024889.html
Copyright © 2011-2022 走看看