Shell脚本编程(1)之使用变量

Shell脚本编程(1)之使用变量

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

本部分内容参考自《Linux命令行与shell脚本编程大全 第3版》。

环境变量

Shell 维护着一组环境变量,用来记录特定的系统信息。比如系统的名称、登录到系统上的用户名、用户的系统 ID(也称为 UID)、用户的默认主目录以及 Shell 查找程序的搜索路径。 可以用 set 命令来显示一份完整的当前环境变量列表。

$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
CLICOLOR=1
COLUMNS=168
COMP_WORDBREAKS=$' \t\n"\'><=;|&(:'
DIRSTACK=()
EUID=0
GROUPS=()
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
...
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}
quote_readline () 
{ 
    local quoted;
    _quote_readline_by_ref "$1" ret;
    printf %s "$ret"
}

在脚本中,你可以在环境变量名称之前加上美元符 $ 来使用这些环境变量。下面的脚本演示了这种用法。

$ cat test1.sh
#!/bin/bash
echo "User info for userid: $USER"
echo UID: $UID
echo HOME: $HOME""

 $USER$UID$HOME 环境变量用来显示已登录用户的有关信息。脚本输出如下:

$ ./test1.sh 
User info for userid: root
UID: 0
HOME: /root

注意, echo 命令中的环境变量会在脚本运行时替换成当前值。另外,在第一个字符串中可以将 $USER 系统变量放置到双引号中,而 Shell 依然能够知道我们的意图。但采用这种方法也有一个问题。看看下面这个例子会怎么样。

$ echo "The cost of the item is $15"
The cost of the item is 5

显然这不是我们想要的。只要脚本在引号中出现美元符,它就会以为你在引用一个变量。在这个例子中,脚本会尝试显示变量 $1(但并未定义),再显示数字 5。要显示美元符,你必须在它前面放置一个反斜线。

$ echo "The cost of the item is \$15"
The cost of the item is $15

看起来好多了。反斜线允许 Shell 脚本将美元符解读为实际的美元符,而不是变量。

 你可能还见过通过 ${variable} 形式引用的变量。变量名两侧额外的花括号通常用来帮助识别美元符后的变量名。

用户变量

除了环境变量, Shell 脚本还允许在脚本中定义和使用自己的变量。定义变量允许临时存储数据并在整个脚本中使用,从而使 Shell 脚本看起来更像一个真正的计算机程序。
用户变量可以是任何由字母、数字或下划线组成的文本字符串,长度不超过 20 个。用户变量区分大小写,所以变量 Var1 和变量 var1 是不同的。
使用等号将值赋给用户变量。在变量、等号和值之间不能出现空格(另一个困扰初学者的用法)。这里有一些给用户变量赋值的例子。

var1=10
var2=-57
var3=testing
var4="still more testing"

Shell 脚本会自动决定变量值的数据类型。在脚本的整个生命周期里, Shell 脚本中定义的变量会一直保持着它们的值,但在 Shell 脚本结束时会被删除掉。
与系统变量类似,用户变量可通过美元符引用。

$ cat test2.sh
#!/bin/bash
days=10
guest="Katie"
echo "$guest checked in $days days ago"
days=5
guest="Jessica"
echo "$guest checked in $days days ago"

运行脚本会有如下输出。

$ ./test2.sh 
Katie checked in 10 days ago
Jessica checked in 5 days ago

变量每次被引用时,都会输出当前赋给它的值。重要的是要记住,引用一个变量值时需要使用美元符,而引用变量来对其进行赋值时则不要使用美元符。通过一个例子你就能明白我的意思。

$ cat test3.sh 
#!/bin/bash
value1=10
value2=$value1
echo The resulting value is $value2

在赋值语句中使用 value1 变量的值时,仍然必须用美元符。这段代码产生如下输出。

$ ./test3.sh 
The resulting value is 10

要是忘了用美元符,使得 value2 的赋值行变成了这样:

value2=value1

那你会得到如下输出:

The resulting value is value1

没有美元符,Shell 会将变量名解释成普通的文本字符串,通常这并不是你想要的结果。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/shell-1.html

Buy me a cup of coffee ☕.