嗨! 本文是Howtoforge shell脚本教程系列的第二部分。 到这个时候,我假设你已经阅读了系列的第一部分 ,并且知道如何创建一个简单的脚本并执行它。 在第二部分中,您将了解如何接受来自用户的输入并通过shell脚本进行处理。 让我们开始吧!
Linux中的变量
就像编程语言一样,Linux shell具有将数据存储在变量中的功能。 一个变量是一个容器,它临时存储将通过编程语言处理的数据。 Linux中有两种类型的变量:环境变量和shell变量。
环境变量
环境变量是Linux中的默认变量,用于在shell中的进程之间传递信息。 环境变量是区分大小写的,应该始终大写,以便访问它们。
下表显示了Linux shell中常见的环境变量:
变量名 | 用法 |
BASH | 保存Bash脚本的命令解释器的完整路径 |
BASH_VERSION | 保存当前使用的机器的bash发行版本 |
家 | 保存主目录的相对路径。 |
LOGNAME | 保存登录的当前用户的帐户名称 |
OSTYPE | 持有描述所使用机器的当前操作系统的字符串 |
路径 | 在Linux中保存可执行文件的冒号分隔的绝对路径 |
PWD | 保存shell的当前工作目录 |
Shell | 拥有首选的命令行shell |
用户 | 类似于LOGNAME。 它保存当前登录的用户的帐户名称 |
_ | 在shell中保存最近使用的命令的名称 |
要显示环境变量的值,用户必须在要访问的变量上添加一个美元符号($)。 例如,要使用echo显示一些系统信息,如当前工作目录,登录用户和OS类型,我们使用:
#!/bin/bash
echo $PWD
echo $LOGNAME
echo $OSTYPE
结果是:
要在Linux中获取整个环境变量列表,请使用env
命令。
改变环境变量的值
为了提供系统灵活性,可以操纵这些环境变量。 要将值设置为环境变量,请使用赋值表达式(等号)。
例:
#!/bin/bash
echo $USER
USER="new user"
echo $USER
脚本的结果是:
运行脚本时,首先,$ USER行$ echo中的$ USER
显示USER变量的值。 通过使用赋值运算符(=),USER变量更改其值。 但是,如果用户将未知值分配给环境变量,shell将创建与脚本本地上下文环境变量类似的另一个shell变量,但不会影响其他应用程序的行为。 意思是,一旦我们的脚本被关闭,USER变量将保留其默认值。
请注意,在前面的例子中,当操作环境变量的值(如USER =“new user”
)时,我们在变量名中省略了美元符号($)。 另外,当使用赋值运算符时,USER和= sign之间不能有空格。 在它们之间添加空格会产生错误。
Shell变量
shell还允许用户声明变量。 就像PHP一样,要在shell脚本中声明一个变量,用户不必担心声明其数据类型; 解释器将根据用户在运行时存储的数据自动检测变量的数据类型。
命名shell变量的规则
就像任何编程语言一样,命名shell变量也有规则。 以下总结规则:
- 变量的名称必须以字母或下划线开头。
- 它必须只包含字母数字或字符。
- 变量因此区分大小写,变量路径PATH和Path是不同的。
为了证明这个规则,我们将在下面创建一个简单的脚本:
#!/bin/bash
12abc=10
abc#*=10
_abc=10
_ABC=2
echo $12abc $abc#* $_abc $_ABC
行2和3返回“命令未找到”错误,因为变量12abc以数字字符开头,变量abc#*包含非法字符。 我们还证明_abc和_ABC是不同的变量,而_ABC = 2行不会覆盖_abc的值。
使用read命令将值分配给shell变量:
read
是一个允许用户接受输入的命令。 使用read命令的语法是:
read <variable_name>
例如,我们将创建一个脚本,允许用户输入他的姓名并显示它们。 为了让用户知道该怎么做,我们使用echo命令显示用户提示。
#!/bin/bash
echo "Your first name: "
read fname
echo "Your last name:"
read lname
echo "Hello $fname $lname ! I am learning how to create shell scripts."
结果是:
请注意,像我们前面的例子一样,我们不必声明一个变量来使用它。 解释器也自动创建在read命令中使用的变量。 但是,在本示例中,我们反复使用echo命令为用户创建提示。 读取命令还具有在接受用户输入时创建提示的功能。 在read命令中使用prompt的语法是:
read -p "Your prompt: " <variable_name>
为了简化我们以前的代码,我们可以将代码重建为:
#!/bin/bash
read -p "Your first name: " fname
read -p "Your last name: " lname
echo "Hello $fname $lname ! I am learning how to create shell scripts"
read命令的另一个好处是命令提示符正好在文本之后,而不在下面的行中。
读命令也可用于接受密码。 与普通输入不同,密码被屏蔽以提供安全性。 接受密码的语法是:
read -s -p "your prompt" <variable_name>
使用shell执行简单的算术运算
除了接受输入和显示输出外,bash shell还具有内置算术选项。 下表总结了Bash shell的内置算术运算符。
操作员 | 描述 | 句法 | 用法 |
+ | 加成 | a = $((b + c)) | 添加b 和c 的值并将其存储到变量a |
- | 减法 | a = $((bc)) | 从b中 减去c 的值并将其存储到变量a |
* | 乘法 | a = $((b * c)) | 将b 和c 的值相乘并将其存储到变量a |
/ | 师 | a = $((b / c)) | 将b 的值除以c 并将其存储到变量a |
% | 模数 | a = $((b%c)) | 执行b 和c的 模除法并将其存储到变量a |
++ | 预增量 | $((++ aa)) | 立即增加变量a 的值 |
++ | 后增量 | $((a ++)) | 增加变量a 的值并将更改反映到下一行 |
- | 预减量 | $(( - a)) | 立即减少变量a 的值 |
- | 递减后 | $((a--)) | 减少变量a 的值,并将变化反映到下一行 |
** | 指数 | $((**)) | 将a的值提高到2的指数 |
+ = | 加上平等 | $((a + = b)) | 添加a 和b 的值并将其存储到变量a |
- = | 负数相等 | $((a- = b)) | 从a中 减去b 的值并将其存储到变量a |
* = | 时间相等 | $((a * = b)) | 将a 和b 的值相乘并将其存储到变量a |
/ = | 斜线相等 | $((a / = b)) | 除以a的值,并将其存储到变量a |
%= | Mod-equal | $((a%= b)) | 在a 和b 之间执行模数除法并将其存储到变量a |
请注意,每次执行算术指令时,我们的所有变量将以美元符号和双括号括起来。 通过这样做,解释器将我们的变量的值视为整数。 没有它,解释器将变量的值视为字符串。 举一个例子,看下面的脚本:
#!/bin/bash
read -p "Enter int1: " a
read -p "Enter int2: " b
echo $((a+b))
c=$a+$b
echo $c
当我们运行我们的例子时,行$((a + b))分别添加存储在变量a和b中的用户的值,而c = $ a + $ b将变量a和b作为字符串。
结论
我们已经介绍了如何接受输入并将其存储在变量上,以及如何在bash shell脚本中执行算术运算。 在下一部分中,我们将介绍控制结构,特别是决策结构。
参考文献:
Linux信息项目。 (2007)。 检索2015年4月29日,从Linfo.org:http://www.linfo.org/
Cooper,M.(nd)。 高级Bash脚本指南。 检索于2015年4月29日,来自http://www.tldp.org/LDP/abs/html/
环境变量。 (nd)。 从2015年4月29日检索,从Ubuntu文档: https : //help.ubuntu.com/community/EnvironmentVariables