p { margin-bottom: 0.25cm; line-height: 120% }

(一)首先来看什么是变量,在shell中打印出变量采用的是echo $path或者echo ${path}的方式

比如打印出当前系统路径变量就采用echo $PATH的方式

root@zhf-linux:/home/zhf# echo $PATH

p { margin-bottom: 0.25cm; line-height: 120% }

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

那么如何设置和修改变量呢?比如echo $myname得到的结果是空值。按照如下方式进行复制即可

root@zhf-linux:/home/zhf# myname=zhf

root@zhf-linux:/home/zhf# echo $myname

zhf

其中变量赋值有几点需要注意;

1
=两边不能直接接空格符。比如下面的这种形式就会报错。有了空格后,空格后的zhf就被当做了命令而不是变量

root@zhf-linux:/home/zhf#
myname=chengdu zhf

No
command 'zhf' found, did you mean:

Command
'zhm' from package 'zephyr-clients' (universe)

Command
'zmf' from package 'zoneminder' (universe)

Command
'zf' from package 'zend-framework-bin' (universe)

zhf:
command not found

2
变量的开头不能是数字,必须是字母。下面的赋值就是错误的

root@zhf-linux:/home/zhf#
1myname=zhf

1myname=zhf:
command not found

3
在第一点中说到不能有空格符,但是如果确实有空格符可以用双引号或者单引号将变量内容结合起来

root@zhf-linux:/home/zhf#
myname="chengdu zhf"

root@zhf-linux:/home/zhf#
echo $myname

chengdu
zhf

但是有一种情况需要注意,那就是双引号或者单引号里面有$字符的时候。首先讲下$在赋值的时候的作用。如果我们想把一个变量赋值给另外一个变量,就要采用$的方式。比如我想将PATH的内容赋值给myname

root@zhf-linux:/home/zhf#
myname=$PATH

root@zhf-linux:/home/zhf#
echo $myname

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

如果$出现在双引号中,可以保持原本的特性。也就是说$在双引号中还是代表一个变量的意思

root@zhf-linux:/home/zhf#
myname="chengdu $PATH"

root@zhf-linux:/home/zhf#
echo $myname

chengdu
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

但是如果$出现在单引号中,那么$就只能代表一般字符的意思,不能代表变量了。

root@zhf-linux:/home/zhf#
myname='chengdu $PATH'

root@zhf-linux:/home/zhf#
echo $myname

chengdu
$PATH

4
如果想将变量变成系统变量,通过export的方式

5
$本身也是变量。这个代表的是这个shell的线程代号。也就是PID(procedd
id). Echo $$的时候就会出现当前的PID号码

root@zhf-linux:/home/zhf#
echo $$

3157

6
?代表的是上次shell命令的执行结果,如果命令执行成功,则返回0,否则返回非0,也就是具体的错误码

root@zhf-linux:/home/zhf#
myname=chengdu zhf

No
command 'zhf' found, did you mean:

Command
'zf' from package 'zend-framework-bin' (universe)

Command
'zhm' from package 'zephyr-clients' (universe)

Command
'zmf' from package 'zoneminder' (universe)

zhf:
command not found

root@zhf-linux:/home/zhf#
echo $?

127

(二)下面来看下环境变量和自定义变量。有些书上也称为全局变量和局部变量。

当登录Linux并取得一个bash之后,你的bash就是一个独立的进程,接下来你在这个bash下执行的任何命令都是由这个bash衍生出来的。这些命令就被称为子进程。子进程可以继承父进程的环境变量,不会继承父进程的自定义变量。

那么也就是说环境变量是给所有子进程共享的,而自定义变量只是当前进程可以获取。要想将自定义变狼转换程环境变量。就要用到export命令。
我们来看一个具体的例子。

(1)
首先定义一个变量name=’zhf’

root@zhf-linux:/home/zhf/zhf/shell_prj#
name="zhf"

root@zhf-linux:/home/zhf/zhf/shell_prj#
echo $name

zhf

(2)然后创建一个sh文件,里面就一条命令echo
$name。执行sh.test.sh的时候得不到任何值

root@zhf-linux:/home/zhf/zhf/shell_prj#
sh test1.sh

(3)
用export命令将name转变成环境变量。并在export中查看
可以看到 declare
-x name=”zhf”

declare是申明变量用的,-x的作用和export一样

root@zhf-linux:/home/zhf/zhf/shell_prj#
export name

root@zhf-linux:/home/zhf/zhf/shell_prj#
export | grep 'name'

declare
-x name="zhf"

(4)再次执行sh
test1.sh. 打印出了name的名字

root@zhf-linux:/home/zhf/zhf/shell_prj#
sh test1.sh

zhf

在整个执行过程中,sh
test1.sh就是当前bash的子进程。当name是自定义变量的时候,test1.sh中是获取不了name的。只有在export
name后。子进程test1.sh才能获取到。

同样的还可以运用到sh文件中去,test1.sh中的代码如下:

name=”zhf”

export
name

sh
test2.sh

test2.sh的代码如下:

echo
$name

如果在test1.sh中没有export
name,那么在test2.sh中就无法访问到这个变量。

(三)变量的读取和申明。

在对变量赋值的时候,我们经常通过键盘输入的方式进行读取。要读取来自键盘的命令,就要用到read整个命令。

-p:
后面接提示符

-t:后面可以接秒数,不会一直等待客户

root@zhf-linux:/home/zhf/zhf/shell_prj#
read -p "please input your name:"

please
input your name:zhf

我们知道在程序中变量也是有类型的,比如数组,整型,只读等等。什么能够变量的类型就要用到declare命令:

-a:
定义为数组类型

-i:定义为整数类型

-x:用法和export一样,将variable变成环境变量

-r:定义位只读类型,内容不可以更改

我们来看下使用的例子,在这里定义sum=100+200+300在这里我们期望得到600,但是结果却是100+200+300

root@zhf-linux:/home/zhf/zhf/shell_prj#
sum=100+200+300

root@zhf-linux:/home/zhf/zhf/shell_prj#
echo $sum

100+200+300

原因在于没有定义sum的类型。变量的默认类型位字符类型。当我们申明类型后就可以得到600了。

root@zhf-linux:/home/zhf/zhf/shell_prj#
declare -i sum

root@zhf-linux:/home/zhf/zhf/shell_prj#
sum=100+200+300

root@zhf-linux:/home/zhf/zhf/shell_prj#
echo $sum

600

申明为只读类型的时候,是无法更改的

root@zhf-linux:/home/zhf/zhf/shell_prj#
declare -r sum1

root@zhf-linux:/home/zhf/zhf/shell_prj#
sum1=100

bash:
sum1: readonly variable

同时也无法删除只读变量,只有在注销bash的时候才能删除,因此定义只读变量需谨慎

root@zhf-linux:/home/zhf/zhf/shell_prj#
unset sum1

bash:
unset: sum1: cannot unset: readonly variable

申明为数组的情况,注意在访问具体的数组元素的时候用的${sum2[1]}

root@zhf-linux:/home/zhf/zhf/shell_prj#
declare -a sum2

root@zhf-linux:/home/zhf/zhf/shell_prj#
sum2[1]=zhf

root@zhf-linux:/home/zhf/zhf/shell_prj#
sum2[2]=zhf1

root@zhf-linux:/home/zhf/zhf/shell_prj#
echo ${sum2[1]}

zhf

(四)变量内容的删除,替代与替换

我们用一个比较长的变量PATH来进行测试。首先将PATH赋值给path。

root@zhf-linux:/home/zhf#
echo $path

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

在path中有这么多的路径,如果我想将从开始到/local/bin结尾的变量都删除,该如何操作呢。操作如下

root@zhf-linux:/home/zhf#
echo ${path#/*local/bin:}

/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

如果我只想保留最后一个/usr/local/games,可以像下面这样操作。

root@zhf-linux:/home/zhf#
echo ${path##/*:}

/usr/local/games

前面的#以及##都是从前往后删除,如果想从后往前删除,就要采用如下的方式:

root@zhf-linux:/home/zhf#
echo ${path%:*games}

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

删除掉最长的:

root@zhf-linux:/home/zhf#
echo ${path%%:*games}

/usr/local/sbin

字符的替换采用如下的方式:单个替换

root@zhf-linux:/home/zhf#
echo ${path/sbin/bisan}

/usr/local/bisan:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

全部替换

root@zhf-linux:/home/zhf#
echo ${path//sbin/bisan}

/usr/local/bisan:/usr/local/bin:/usr/bisan:/usr/bin:/bisan:/bin:/usr/games:/usr/local/games

几种方式都介绍完了,下面来总结下

${变量#关键字}
若变量从头开始的数据符合关键字,则将符合的最短数据删除

${变量##关键字}
若变量从头开始的数据符合关键字,则将符合的最长数据删除

${变量%关键字}
若变量从尾向前的数据符合关键字,则将符合的最短数据删除

${变量%%关键字}
若变量从尾向前的数据符合关键字,则将符合的最长数据删除

${变量/旧字符串/新字符串}若变量符合旧字符串,则替换第一个旧字符串

${变量//旧字符串/新字符串}
若变量符合旧字符串,则替换全部旧字符串

一起来学linux:shell script(一)关于变量的更多相关文章

  1. 一个改动配置文件的linux shell script

    不久以前,以前搜到一篇博客是读取配置文件的,http://www.cnblogs.com/bo083/archive/2012/11/19/2777076.html,用到如今,感觉十分方便.感谢作者. ...

  2. Linux shell script All In One

    Linux shell script All In One refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  3. shell编程 Shell script 的默认变量($0, $1...)

    Shell script 的默认变量($0, $1...) 我们知道指令可以带有选项与参数,例如 ls -la 可以察看包含隐藏文件的所有属性与权限.那么 shell script 能不能在脚本文件名 ...

  4. Linux Shell Script目录

    目录 Linux Shell基础 开始Shell编程 代码 示例代码查看:https://github.com/Furzoom/demo-C/tree/master/src/shell

  5. Linux shell Script初识

    shell secript: 执行方式的差异: ./ sh执行都是在创建一个子程序来执行,只会继承环境变量, 其中的变量如果export声明,子程序的子程序会继承,不会升级为环境变量 source 的 ...

  6. Linux Shell 01 脚本与变量

    一 脚本的创建和执行 1. 创建文件*.sh,文件后缀为sh 2. 编辑脚本 首行必须为:#!/bin/bash   #指定解释脚本的shell 3. 赋权 chmod u+x a.sh 4. 执行 ...

  7. 『忘了再学』Shell基础 — 21、变量的测试与内容置换

    目录 1.什么是变量的测试与内容置换 2.变量的测试与内容置换 3.示例 例1: 例2: 例3: 1.什么是变量的测试与内容置换 我们之前说过,在Shell中,一个变量未定义,和一个变量为空值的输出效 ...

  8. fastq to tasta using linux shell script

    #!/bin/bash usage() { echo " "; echo "############################################### ...

  9. (一)Linux Shell编程——简介、变量、字符串、数组

    1. Shell简介 1.1 Shell出现背景 Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件. 对于图形界面,用户点击某个图标就能启动某个程序:对于命令行,用户输入某个程序的名字( ...

随机推荐

  1. 【RegExp】JavaScript中正则表达式判断匹配规则以及常用方法

    字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在. 正则表达式是一种用来匹配字符串的强有力的武器.它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符 ...

  2. 初识Java,猜字游戏

    import java.util.*; public class caizi{ public static void main(String[] args){ Scanner in=new Scann ...

  3. IIS7.5应用程序池集成模式和经典模式的区别介绍

    IIS7.5应用程序池集成模式和经典模式的区别介绍 作者:  字体:[增加 减小] 类型:转载 时间:2012-08-07   由于最近公司服务器上需要将iis的应用程序池全部都升级到4.0的框架,当 ...

  4. Pycharm中的加载多个项目

    使用Pycharm,总会创建几个项目文件,有时候又不想全部一个一个的打开,所以这时候需要一个项目共存的方法,现在说一下怎么项目共存. 中英文对照 英文:首先打开setting界面: 中文首先打开设置界 ...

  5. POJ 1308 Is It A Tree? 解题报告

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 32052   Accepted: 10876 D ...

  6. 【技术干货】听阿里云CDN安防技术专家金九讲tengine+lua开发

    一.介绍 二.安装 三.运行 四.开发 1.介绍 Tengine:轻量级.高性能.高并发.配置化.模块化.可扩展.可移植的Web和反向代理 服务器,Tengine是nginx超集,但做了很多优化,包含 ...

  7. python学习===将py文件从打包成exe程序

    1.进入要打包的py程序所在文件夹,例如hello.py程序要打包. 2.在同一目录下新建文件setup.py,内容如下: from distutils.core import setup impor ...

  8. trycatch放在for循环的里面还是外面好

    try放在for循环里面和外面的区别是什么呢?先看看下面的代码的区别:public class Test {    public void test1(){        for (int count ...

  9. 如何实现.5px的线条和.5px的圆角边框

    实现.5px的线条 网络上有很多方法,如设置viewport,box-shawdow,border-image,background-image,transform:scale等,这里不做介绍(百度或 ...

  10. 设计模式的征途—20.备忘录(Memento)模式

    相信每个人都有后悔的时候,但是人生并无后悔药,有些错误一旦发生就无法再挽回,有些事一旦错过就不会再重来,有些话一旦说出口也就不可能再收回,这就是人生.为了不让自己后悔,我们总是需要三思而后行.这里我们 ...