写在前面的话:博客中所有的脚本文件执行之前都要加上此命令:
chmod u+x <文件名> #给文件的属主添加执行权限
一、环境变量
在脚本中,你可以在环境变量名称之前加上美元符号( $ )来使用这些环境变量。
[root@CHENDAJIE sh.test]# cat test2.sh
#!/bin/bash
# display user information from the system.
echo "User info for userid: $USER"
echo UID: $UID
echo HOME: $HOME
$USER、$UID、$HOME环境变量用来显示已登录的用户的有关信息
。
输出如下:
[root@CHENDAJIE sh.test]# ./test2.sh
User info for userid: chendajie
UID: 0
HOME: /root
echo命令中的环境变量会在脚本运行时替换成当前值。下面的例子使用了转义符- -写《鸟哥的Linux私房菜基础篇学习笔记》时会涉及到。此处不多做解释。
[root@CHENDAJIE sh.test]# echo "The cost of the item is $15"
The cost of the item is 5
[root@CHENDAJIE sh.test]# echo "The cost of the item is \$15"
The cost of the item is $15
二、 用户变量
例如:
定义临时变量(因为前几章没有写博客,所以需要等等把它们补上来。)
[root@CHENDAJIE sh.test]# var1=10
[root@CHENDAJIE sh.test]# var2=-57
[root@CHENDAJIE sh.test]# var3=testing
[root@CHENDAJIE sh.test]# var4="still more testing"
查看test3.sh脚本
[root@CHENDAJIE sh.test]# cat test3.sh
#!/bin/bash
# testing variables
days=10
guest="Jie"
echo "guest checked in $days days ago"
days=5
guest="Chen"
echo "$guest checked in $days days ago"
执行
[root@CHENDAJIE sh.test]# ./test3.sh
guest checked in 10 days ago
Chen checked in 5 days ago
变量每次被引用时,都会输出当前你赋给它的值。
查看tesh4.sh文件
[root@CHENDAJIE sh.test]# cat test4.sh
#!/bin/bash
# assigning a varible value to another varible
value1=10
value2=$value1
echo The resulting value is $value2
执行:
[root@CHENDAJIE sh.test]# ./test4.sh
The resulting value is 10
当忘记美元符时:
将test4.sh文件内容改为下列内容:
[root@CHENDAJIE sh.test]# vim test4.sh
#!/bin/bash
# assigning a varible value to another varible
value1=10
value2=value1 #此处没有美元符
echo The resulting value is $value2
执行test4.sh:
[root@CHENDAJIE sh.test]# ./test4.sh
The resulting value is value1
可以看到此时shell将变量名解释成普通的文本字符串。
三、命令替换
有两种方法可以将命令输出赋给变量:
1、反引号字符( ` )
2、$()格式
查看脚本内容
[root@CHENDAJIE sh.test]# cat test5.sh
#!/bin/bash
#
testing=$(date) #此处$(date)替换成`date`也可以
echo ""The date and time are: " $testing
执行文件
[root@CHENDAJIE sh.test]# ./test5.sh
The date and time are: 2019年 10月 08日 星期二 20:49:56 CST
在这个例子中:变量testing获得了date命令的输出,然后用echo语句显示出它的值。
下面这个例子的作用是:
在脚本中通过命令替换获得当前日期并用它来生成唯一文件名。
查看脚本内容:
[root@CHENDAJIE sh.test]# cat test6.sh
#!/bin/bash
# copy the /usr/bin directory listing to a log file
today=$(date +%y%m%d)
ls /usr/bin -al > log.$today
给脚本文件执行权限:
[root@CHENDAJIE sh.test]# chmod u+x test6.sh
执行后输出结果,可以看到此时显示了一个新文件
[root@CHENDAJIE sh.test]# ./test6.sh
[root@CHENDAJIE sh.test]# ls
log.191008 test1.sh test2.sh test3.sh test4.sh test5.sh test6.sh
注意:
命令替换会创建一个子shell来运行对应的命令。子shell(subshell)是由运行该脚本的shell所创建出来的一个独立的子shell(child shell)。正因如此,子shell所执行命令是无法使用脚本中所创建的变量的。
在命令行提示符下**使用路径./运行命令的话,也会创建出子shell要是运行命令的时候不加入路径,就不会创建子shell。**如果你使用的是内建的shell命令,并不会涉及子shell。