Linux学习笔记三-Shell编程

2023-05-16

bash脚本编写

编写bash脚本程序有两种方式。
1. 可以输入一系列命令让bash交互地执行它们,
2. 也可以把这些命令保存到一个文本文件中,然后将该文件作为一个程序来调用。

在执行shell命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令,例:
[root@localhost root]# ls a* -l; free;df
长shell命令行可以使用反斜线字符(\)在命令行上扩充,例如:
[root@localhost root]# echo "this is \> long command"
注意:“>”符号是自动产生,而不是输入。

bash脚本的建立

bash程序的每一行既可以是bash语句,又可以是bash命令。

1. 程序中的注释行以#符号开始,一直持续到该行的结束。

2. 程序中第一行# !/bin/bash,它是注释语句的一种特殊形式,#!字符告诉系统同一行上紧跟在它后面的那个参数是用来执行本文件的程序。

3. /bin/bash是默认的shell程序。

例:

[root@localhost root]# vi  scp1
#!/bin/bash
#一个简单例子
who
pwd
date

bash脚本的运行

1. 运行/bin/bash命令并且把脚本文件名作为它的参数。

[root@localhost root]# /bin/bash scp1

如果你的搜索路径(PATH变量)中包含了/bin目录的话,可以简单地使用bash命令。
增加环境变量的方法:

export PATH=/bin/bash:$PATH

查看环境变量

echo $PATH

在变量中有/bin/bash就可以直接用bash命令了

bash scp1

2. 脚本文件加上可执行的权限。


[root@localhost root]# chmod u+x scp1
[root@localhost root]# ./scp1

实例补充

例:编写一个shell程序mkf ,此程序的功能是:
显示root下的文件信息,
然后建立一个kk的文件夹,
在此文件夹下新建一个文件aa,
修改此文件的权限为可执行。

分析:此shell程序中需要依次执行命令:
进入root目录:cd  /root
显示root目录下的文件信息:ls  –l
新建文件夹kk:mkdir  kk
进入root/kk目录:cd  kk
新建一个文件aa:vi  aa   #编辑完成后需手工保存
修改aa文件的权限为可执行:chmod  a+x  aa
回到root目录:cd  /root
[root@localhost root]#vi mkf
#!/bin/bash
cd  /root
ls  –l
mkdir  kk
cd  kk
vi  aa  
chmod  a+x  aa
cd  /root

Shell变量

  • bash与其他程序设计语言一样也采用变量来存放数据,使用变量之前通常并不需要事先为它们做出声明。

  • 默认情况下,所有变量都被看作字符串并以字符串来存储,即使它们被赋值为数值时也是如此。

  • shell和一些工具程序会在需要时把数值型字符串转换为对应的数值以对它们进行操作。

shell变量可以分为两大类型:环境变量和用户定义变量。

1.环境变量

环境变量用来定制你的shell的运行环境,保证shell命令的正确执行。

所有环境变量会传递给shell的子进程。

这些变量大多数在/etc/profile文件中初始化,而/etc/profile是在用户登录的时候执行的。

2.用户自定义变量

变量的声明

bash不需要声明变量,没有声明的变量默认为字符串。
但有些特殊类型的变量必须要声明。

命令语法:
declare [options] [name[=value]]
typeset [options] [name[=value]]
功能:声明变量,初始化变量,设置他们的属性。当不使用name和options的时候,显示所有shell变量和他们的值。

常用选项:
   -a     声明“name”是一个数组
    -f     声明“name”是一个函数
    -i     声明“name”是一个整数
    -r     声明“name”是只读的变量
    -x    表示每一个“name”变量都可以被子进程访问到,称为全局变量

例:

[root@localhost root]# declare –i age=20
    #声明整型变量age并赋值为20;
[root@localhost root]# declare –rx OS=LINUX
    #声明只读全局字符串变量OS并赋值为LINUX;
[root@localhost root]# declare –i
    #显示所有整型变量;
[root@localhost root]# declare –x
   #显示所有全局变量;

变量的赋值

格式:变量名=值
例:
x=6
a=”hello world”

注意:
必须保证等号(=)前后没有空格。

字符串类型变量不需要预先声明

上例的x如果没有预先声明,它的值6是一个字符串,你可以用declare –i查找下是否有x。

变量引用

在shell中,可以通过在变量名前加一个$符号来访问它的内容。

如:
a=”hello world”
echo “A is: $a”

一个变量给另一个变量赋值可以写成:
变量2= 1x= i

例:

[root@localhost root]#n=20
[root@localhost root]#n=n+30
[root@localhost root]#echo $n
n+30#显示的结果

可知默认情况下是字符串类型

例:

[root@localhost root]#declare –i n
[root@localhost root]#n=20
[root@localhost root]#n=n+30  或n=$n+30
[root@localhost root]#echo $n
50

单引号、双引号和反斜杠的使用

使用双引号可引用除字符$、`、\外的任意字符或字符串。对大多数的元字符(包括*)都将按字面意思处理。如果用双引号“”将值括起来,则允许使用$符对变量进行替换。字符串通常都被放在双引号中,以防止它们被空白字符分开。

如果用单引号‘’将值括起来,则不允许有变量替换,而不对它做shell解释。

反斜杠\用来去除某些字符的特殊含义并把它们按字面意思处理,其中就包括$。

例2.2 下面例子可以解释双引号、单引号和反斜杠的含义。

    [root@localhost root]# BOOK=”linux book”
    [root@localhost root]# MSG1=’$BOOK’
    [root@localhost root]# MSG2=“$BOOK”
    [root@localhost root]# MSG3=“\$BOOK”
    [root@localhost root]# echo  MSG1  MSG2  MSG3
        MSG1  MSG2  MSG3
    [root@localhost root]# echo  $MSG1  $MSG2  $MSG3
           $BOOK    linux book   $BOOK

命令替换

当一个命令被包含在一对括号里并在括号前加上 (command),

或者被包含在反引号(如command`)中的时候,shell把它替换为这个命令的输出结果。这个过程被称为命令替换

[root@localhost root]#pwd
/root/d1
[root@localhost root]# cmd1=pwd
[root@localhost root]# echo “The value of command is: $cmd1.”
The value of command is: pwd.
[root@localhost root]# cmd1=$(pwd)
[root@localhost root]# echo “The value of command is: $cmd1.”
The value of command is: /root/d1.

#或者
cmd1='pwd'

命令替换适用于任何命令。
在下面的例子中,在echo命令执行前,date命令的输出就替换了$(date)。

[root@localhost root]# echo “The date and time is $(date).”
The date and time is 92010:23:16 UTC 2011.

输入命令

可以使用read命令来将用户的输入赋值给一个shell变量中。
语法:read [options] variable-list

常用选项:
-a   name  把词读入到name数组中去。
-e      把一整行读入到第一个变量中,其余的变量均为null。
-n      在输出echo后的字符串后,光标仍然停留在同一行。
-p   prompt   如果是从终端读入数据则显示prompt字符串。

说明:多个数据或变量时用空格分隔

  • 若变量个数与数据个数相等,则对应赋值。
  • 若变量个数大于输入数据个数,则没有输入数据的变量取空值。
  • 若变量个数小于输入数据个数,则多余的数据赋给最后一个变量。

例:

[root@localhost bin]# read  n1  n2  n3
first   second  third  1234  abcd
[root@localhost bin]# echo  $n3
third  1234  abcd
[root@localhost bin]# echo  $n1  $n2
first  second
[root@localhost bin]# read  n1  n2  n3
1  2
[root@localhost bin]# echo  $n3

[root@localhost bin]# echo  $n1  $n2
1  2

例:运行程序test3,从键盘读入x、y的值,然后做加法运算,最后输出结果。

[root@localhost bin]#vi  test3
#!/bin/sh
read x y
z=`expr $x + $y`
echo "The sum is $z"
#设置权限:
[root@localhost bin]#chmod +x test3
#执行:
[root@localhost bin]# ./test3
45  78
The sum is 123

shell脚本位置参数的传递

位置参数

在Linux系统中运行命令或脚本程序时,可以在命令行中进行参数的传递。

在shell脚本传递命令行参数或位置参数中,前9个参数的值被存放在shell环境变量$1到$9中。可以使用这些变量名来引用这些参数的值。

变量$#包含了传递给一个执行中的shell脚本的参数的个数。

变量$*和$@都包含了所有参数的值。

变量$0包含了脚本文件或命令的名字。

例:
demo_arg程序如下

#! /bin/bash
echo “程序名: $0echo “命令传递参数个数:$#echo “参数值分别是:$1 $2 $3 $4 $5 $6 $7 $8 $9echo “所有参数: $@exit 0
[root@localhost root]# demo_arg a b c d e f g h i 

程序名:demo_arg
命令传递参数个数: 9
参数值分别是: a b c d e f g h i
所有参数: a b c d e f g h i

Shift命令

当有脚本程序的参数多于9个时,用shift命令来使用多于9个的参数。每执行一次shift命令,变量0不变,从1开始位置变量左移一位,即把2,3,4 … 9 的值分别赋值给1,2,3 … 8。

命令句法:shift [N]

功能:把命令行参数向左移动N个位置

例:
demo_shift程序如下

#! /bin/bash
echo “程序名:$0echo “所有参数: $@echo “前三个参数:$1 $2 $3”
shift
echo “程序名:$0echo “所有参数: $@echo “前三个参数:$1 $2 $3”
shift 3
echo “程序名:$0echo “所有参数: $@echo “前三个参数:$1 $2 $3exit 0
[root@localhost root]# demo_shift 1 2 3 4 5 6 7 8 9 10 11 12

程序名: demo_shift
所有参数: 1 2 3 4 5 6 7 8 9 10 11 12
前三个参数:1 2 3
程序名: demo_shift
所有参数: 2 3 4 5 6 7 8 9 10 11 12
前三个参数: 2 3 4
程序名: demo_shift
所有参数: 5 6 7 8 9 10 11 12
前三个参数: 5 6 7
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux学习笔记三-Shell编程 的相关文章

  • networkx是什么

    networkx简介 xff1a 官方文档 https www osgeo cn networkx reference classes graph html networkx是Python的一个包 xff0c 用于构建和操作复杂的图结构 x
  • cmd窗口ERROR 1366 (HY000): Incorrect string value: ‘\xFE\xFE\xFE\xFE‘ for column ‘adress‘ at row 1

    cmd窗口ERROR 1366 HY000 Incorrect string value xFE xFE xFE xFE for column adress at row 1怎么办 xff1f 1 首先需要弄明白为什么会报错 xff1f x
  • mysql的视图、存储过程、游标、事务、引擎、索引的认识和使用

    视图 一 视图概念 xff1a 视图是虚拟表 xff0c 并不存在真正的表 xff0c 可以重用sql语句 xff0c 利用实际存在的一个或几个表链接查询数据 xff0c 只展示部分数据 xff0c 可以保护数据库中数据 只有部分表的权限
  • win10下mysql5忘记root用户密码如何修改密码并登录

    步骤 xff1a 1 关闭mysql服务 xff1a net stop mysql 2 进入mysql安装目录 xff1a 如 3 此时可以免密登录 xff1a 另外开启cmd命令窗口 xff1a 一定要记住刷新权限 xff0c 否则可能拒
  • 虚拟机中三种网卡模式详细介绍

    虚拟机中三种网卡模式 vmware为我们提供了三种网络工作模式 xff0c 它们分别是 xff1a Bridged xff08 桥接模式 xff09 NAT xff08 网络地址转换模式 xff09 Host Only xff08 仅主机模
  • centos7 xfce轻量桌面环境和vnc安装

    一 centos7安装xfce轻量桌面环境 Linux的桌面环境gnome kde xfce lxde 等等使用比较https www cnblogs com chenmingjun p 8506995 html 1 安装额外yum源 yu
  • R语言学习笔记——空间自相关:全局Moran’I/局部Moran’I /Geary’c/Moran散点图

    data ChinaRD2 span class token operator lt span readRDS span class token punctuation span span class token string 34 gad
  • FIFO深度计算问题

    FIFO深度计算公式 xff1a fifo depth 61 burst length burst length X Y r clk w clk burst length xff1a 突发数据个数 X Y xff1a 读时钟周期里 xff0
  • 【游戏开发】游戏开发书籍汇总

    1 游戏设计的艺术 2 游戏设计的100个原理 3 我在美国学游戏设计 4 游戏新手村 xff1a 从零开始做游戏 5 Directx游戏开发终极指南 6 Windows游戏编程大师技巧 7 快乐之道 xff1a 游戏设计的黄金法则 人类的
  • Java~String类型空字符串和Null的区别以及判断方法

    一 区别 null表示的是一个对象的值 xff0c 而不是一个字符串 如声明一个对象的引用 xff0c String a 61 null 表示的是一个空字符串 xff0c 也就是说它的长度为0 如声明一个字符串String s 61 Str
  • 解读官方Android MediaPlayer API(1)

    public class MediaPlayerextends ObjectMediaPlayer class 能够用来使用来控制vudio video xff08 音频或视频 xff09 文件和流文件的播放 举个例子可以在 a targe
  • ACM 几何基础(1)

    点 point 定义 xff1a struct point double x y 线 line 定义 xff1a Struct line Point s e 精度差 Const double eps 61 1e 8 Int sgn doub
  • ACM 几何基础(2)

    判断两条线段是否相交 xff1a 矢量 如果一条线段的端点是有次序之分的话 xff0c 那么这种线段就称为 有向线段 xff0c 如果有向线段 p1p2 的起点 p1 在坐标的原点 xff0c 则可以把它称为矢量 p2 矢量的加减 设二维矢
  • ACM 几何基础(3)

    几何基础 xff08 3 xff09 求线段交点 xff1a 前面已经讲了如何判断两条线段是否相交 xff0c 现在我们来学下如何求线段的交点坐标 首先先了解下 xff1a 定比分点公式 公式介绍 数学中常用的重要公式之一 xff01 在
  • ACM 几何基础(4)

    几何基础 xff08 4 xff09 点到线段最短距离 xff1a 主要学下矢量的方法求解 xff1a 点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别 xff0c 即求点到线段最短距离时需要考虑参考点在沿线段方向的投
  • ACM 几何基础(5)

    几何基础 xff08 5 xff09 凸包 xff1a 在学凸包之前 xff0c 最好把叉积弄熟 xff01 定义 xff1a 对一个简单多边形来说 xff0c 如果给定其边界上或内部的任意两个点 xff0c 连接这两个点的线段上的所有点都
  • 【奇技淫巧】薅公司服务器羊毛,IntelliJ IDEA的远程开发

    前言 作为一个程序员 xff0c 在平时工作的时候 xff0c 你觉得电脑的内存多大才够用 xff0c 8G 16G 32G 其实内存对于程序员来说 xff0c 只能说是多多益善 xff0c 像我平时电脑可能一周重启一次 xff0c 开的东
  • ACM 几何基础(6)

    几何基础 xff08 6 xff09 求多边形面积 xff1a 要想计算多边形的面积我们可以转化为求多个三角形的面积之和得到 在解析几何里 xff0c ABC的面积可以通过如下方法求得 xff1a 点坐标 61 gt 边长 61 gt 海伦
  • 解读官方Android MediaPlayer API(2)

    有效和无效状态 xff1a 方法名有效状态无效状态注释getCurrentPosition Idle Initialized Prepared Started Paused Stopped PlaybackCompleted Error 成
  • 解读官方Android MediaPlayer API(3)

    权限 One may need to declare a corresponding WAKE LOCK permission lt uses permission gt element 嵌套类摘要 static interface str

随机推荐