TypechoJoeTheme

MetMan's Blog

网站页面

Shell变量

MetMan博 主
2024-02-16
/
0 评论
/
223 阅读
/
1047 个字
/
百度已收录
02/16
本文最后更新于 2024年02月16日,已超过 216天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

Shell简介

Shell作为一种“胶水”语言,主要目的是将系统中各种工具粘合在一起,其主要功能是方便的调用各种系统命令。为了这一目的,shell被设计成“面向字符串”的语言,即一切皆字符串。(这有点像Unix设计哲学:一切皆文件)

刚接触shell编程时会认为shell脚本只是用来将各种系统命令放在一起组合执行。
但shell实际上是一门编程语言,编程语言具有的特点它一般也都有。

shell编程学习分为两部分:

  • shell语法

    变量、逻辑判断与循环流程控制、函数等语法要素齐全。

  • Unix/Linux系统命令

    系统命令可以看作C语言中的标准库,让用户能够更便捷的完成任务。

但需要注意的是,C是编译型语言,而shell是解释型语言。

变量

Shell主要是字符串处理语言,当然它也提供一些简单的算术预算功能(功能比较弱)。
不同于编译型语言(如C、Fortran),shell是脚本型语言,不需要变量类型声明。
直接var=value这样变量名赋值,变量类型为字符串。也可以通过一些方法声明为数组。

变量声明与引用

Shell变量名称的开头是一个字母或下划线符号,后面接任意长度字母、数字或下划线(与C语言定义类似)。变量名称的字符长度没有限制。shell变量用来保存字符串值。

以下是Bash的保留字(或称关键字),变量声明时应避免使用它们。

! case  coproc  do done elif else esac fi for function if in select then until while { } time [[ ]]

变量赋值

var=value

变量名称紧接着"="字符,最后是新值,中间完全没有任何空格。

变量值可以是空值,即不含任何字符,myvar= 未定义的变量会展开为null空字符串。

if [ -z $undefined ]; then echo null string; fi   # 输出null string 
if [ -n "$undefined" ]; then echo null string; fi # 没有输出
if [ -n $undefined ]; then echo null string; fi # 输出null string, why?

-n判断字符串不是null时为真,为何变量引用不加双引号,结果不是预期的?

如果变量值内含空格,需要加上引号(注意单引号与双引号的区别)

var1=abc
var2=5        #即使是数字,仍以字符串形式存储在变量中
var3=This_is_a_long_string
var4="This_is_a_long_string"      #虽然var4被双引号包围,其值与var3一致
var5="This is a long string with space"  #由于字符串中有空格,必须加引号
var6=4+5  #4+5看似一个数学表达式,但以字符串形式存储在变量中

变量引用

变量的引用有两种方式:

  • 在变量前加上$字符,表示引用这个变量的值。 var7=$var1
  • 使用${}包围变量,如var8=${var2}

符号常量

使用readonly命令使变量称为只读模式,而之后赋值给它们是被禁止的。

hours_per_day=24
readonly hours_per_day
#也可以合并为一句(需要POSIX兼容)
readonly hours_per_day=24

环境变量

环境是一个名称与值的简单列表,可供所有执行中的进程使用。新的进程会从父进程
继承环境,也可以在建立新的子进程之前修改它。

export命令可以将新变量添加到环境变量中去。

PATH=$PATH:/usr/local/bin
export PATH
#或写成一句(须POSIX兼容)
export PATH=$PATH:/usr/local/bin

注意变量赋值放在某一命令名称与参数前,该变量只对当前命令有效,对后面的命令不会有效。

#!/bin/bash

function cmd1(){
    echo local_var is $var
}

var=a
var=b cmd1 
echo org_var is $var

#输出结果为:
local_var is b
org_var is a

export命令仅将变量加到环境中,如果需要从程序的环境中删除变量,则要用env命令,
env也可以临时改变环境变量值。

env -i PATH=$PATH HOME=$HOME awk '...' file1

-i 选项是用来初始化一个空环境变量列表,也就是丢弃任何的继承值,仅传递命令行上指定的变量给程序使用。

env命令也可以查询某个环境变量是否定义了。

env | grep I_MPI_ROOT

unset命令从执行中的shell中删除变量或函数。缺省时,会解除变量设置,加上-v选项
可特指解除变量。-f选项删除函数。

unset var1   #or
unset -v var1
unset -f function_name

比如

unset I_MPI_ROOT
echo $I_MPI_ROOT  # 变量已经没有值了

小结

  • shell是针对字符串处理的一门编程语言。
  • 通过var=value直接赋值给变量,使用$${}引用变量值。
  • readonly声明变量为只读类型,export命令声明变量为环境变量,unset命令删除变量或函数。

参考资料

[1] Bash脚本编程语言中的美学与哲学 http://www.cnblogs.com/youxia/p/linux010.html

[2] man bash

[3] Arnold Robbins, Nelson H.F. Beebe. Shell脚本学习指南

shellbash
朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

MetMan's Blog

本文链接:

https://blog.metman.top/index.php/archives/90/(转载时请注明本文出处及文章链接)

评论 (0)

互动读者

标签云

最新回复

暂无回复

登录
X
用户名
密码