2.1变量

按照惯例,shell变量全用大写字母加下划线表示,有两种类型的shell 变量:

  • 1.环境变量:环境变量可以从父进程传给子进程,因此shell进程的环境变量可以从当前shell进程传给fork出来的子进程。

用env或printenv命令可以显示当前shell进程的 环境变量

$ env
  • 2.本地变量:只存在于当前shell进程,本地变量是shell特有的概念。

使用set命令可以显示当前shell进程中定义的本地变量环境变量函数

$ set
定义一个变量
$ VARNAME=value      定义变量VARNAME的值为value

一个变量定义后仅存在当前shell进程,它是本地变量

$ env | grep VARNAME
$ set | grep VARNAME 
VARNAME=vaule    

export可以把本地变量导出为环境变量:

$ export VARNAME
$ env | grep VARNAME
VARNAME=vaule

定义变量后直接导出为环境变量

export VARNAME=value

unset命令用于删除已定义的环境变量或本地变量。

$ unset VARNAME

在定义变量时不用$,取变量值时用$。变量的值都是字符串,对没有定义变量取值,其值为空。

variable.sh脚本如下

#!/bin/sh
echo $SHELL
echo $SHELLabc
echo $SHELL abc
echo ${SHELL} abc
shell$ ./variable.sh
/bin/bash
/bin/bash abc
/bin/bash abc

2.2命令替换: ` , $()

由反引号扩起来的也是一条命令,shell先执行该命令,然后将输出结果立即代换到当前命令行来。命令行代换也可以用$()表示

$ replace.sh

#!/bin/sh
DATE=`date`
echo $DATE
DATE=$(date)
echo $DATE
shell$ ./replace.sh
Tue Mar 1 20:56:50 CST 2022
Tue Mar 1 20:56:50 CST 2022

2.3算术代换:$(())

用于算术计算,$(())中的shell变量取值将转换成整数。

calc.sh

#!/bin/sh
VAR=45
echo $(($VAR+3))
$ ./calc.sh

2.4单引号:’

用于保持引号内的所有字符的字面值,即使引号内的双引号反斜杠回车也不例外。

single.sh

#!/bin/sh
echo 'abc\"  `date`

单引号内的数据都原样显示:

$ ./single.sh
abc\"  `date`

2.5双引号:""

使用双引号保持引号内的所有字符的字面值(回车也不例外),但以下情况除外:

  1. 反引号用于命令替换。
  2. \$用于表示$
  3. \`用于表示反引号
  4. \"用于表示内嵌的双引号
  5. \\用于表示反斜杠 \
  6. 反斜杠用于非以上的情况,仅表示反斜杠
  7. 对变量的取值 $EXAMPLE

double.sh

#!/bin/sh
echo "$SHELL"
echo "`date`"
echo "I'd say:\"Go for it\""
echo "\\"
$ ./double.sh
/bin/bash
Tue Mar 1 20:59:50 CST 2022
I'd say:"Go for it"

Linux C编程一站式学习

在日常工作中,常常需要判断某个变量是否存在。若变量存在则使用既有的配置,若变量不存在,则给予一个常用的配置。在Shell脚本中,有许多特殊符号用于不同的操作和功能。提供一些可以直接对变量进行操作的符号。通过这些符号,变量中的部分内容可以被删除、替换和替代。中,变量的删除、替换和替代也是非常重要的。通过简单操作修改变量,可以减少代码的行数并提高可读性。 1、在使用多重引号时系统是从前往后看的,能匹配就算一对,所以这样一对一对的断句将整个命令串分为若干部分; 2、为了使系统识别后(被识别的引号会消失)的命令串功能正确,需要使用转义字符手动的在合适的地方加入合适的引号; 将不连续的一串(比如包含空格)作为一个整体,需用单引号双引号括起来,区别在于双引号仍能解析其中的变量等; 倒引号用于命令替换,不过倒引号一般不嵌套,在此主要讨论单双引号的嵌套。 当要引用一个变量的值时,一般推荐使用双引号。使用双引号除了变量名[2]前缀($)、后引符(`)和转义符(\)外,会使shell不再解释引号中其它所有的特殊字符。[3]用双引号时$仍被当成特殊字符,允许引用一个被双引号引起的变量("$variable"),那也是说$variable会被它的值所代替。用双引号还能使句子不被分割开.[4]一个参数用双引号引起来能使它被看做一个单元,这样即使参数里面包含有空白字符也不会被shell分割开了。1#!/bin/bash3。... 将要执行的命令按顺序保存到一个文本文件,给该文件可执行权限,可结合各种shell控制语句以完成更复杂的操作。[root@localhost ~]# 变量名=变量值注: 如果定义变量值中间有空格需要用单、双引号引起来;两边不可以有空格;​123​456​​默认情况下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shell环境时局部变量将无法再使用。可以通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shell环境中能够继续使用。 用户创建得变量仅可用于当前ShellShell默认读取不到父Shell定义得变量,为了把变量传递给子Shell,需要使用export命令,这样输出得变量,对于子Shell来说就是环境变量。由于反斜杠在单引号里面变成了普通字符,所以如果单引号之中,还要使用单引号,不能使用转义,需要在外层的单引号前面加上一个美元符号(声明为整数,覆盖以后,Bash 不会报错,但会赋以不确定的值,上面的例子中可能输出0,也可能输出的是3。单引号用于保留字符的字面含义,各种特殊字符在单引号里面,都会变为普通字符,比如星号(