目录
学习视频乃是慕课教程:https://www.imooc.com/learn/336
本节是学习所作笔记及总结。
概述
shell与其他语言对比:
-
PHP和Java主要实现功能
-
Shell简化管理操作
Bash变量之什么是变量与变量分类
变量:将一个值临时赋给某个变量,如X=2,name="张三",age=45,就可以通过变量name、age来获取它的值,并且可以对值进行修改。
1、变量命名规则
-
变量名必须以字母或下划线开头,中间只能由字母、数字和下划线组成。
-
变量名的长度不得超过255字符。
-
变量名在有效范围内必须是唯一的,即在同一个范围内不能有两个同名的变量。
-
在Bash中,变量的默认类型都是字符串型。
-
在任何系统中,目录名、文件名、变量名都要是有意义的,如name、age而不是abc、xyz不明其意的。
2、变量按照存储数据分类
-
字符串型,如info="hello world"
-
整型,如num=12
-
浮点型,就是小数,如num=12.5
-
日期型
但在Bash中默认类型都是字符串型。
3、变量的分类
-
用户自定义变量。变量是由用户自定义的。
-
环境变量。这种变量中主要保存的是和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的。
-
位置参数变量。其实就是预定义变量的一种,这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
-
预定义变量。是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
Bash变量之用户自定义变量
-
不能用数字作为变量名开头
-
变量赋值时不能有空格
-
变量值里有空格需要用单引号或双引号括起来
1、定义变量
变量名=变量值
例如:
x=34
name="张三"
2、变量调用
echo $变量名
例如:
echo $x
echo $name
注意输出的x的值其实是一个字符串,不能直接参与运算。如$x+$y会报错。
例1:$x+$y命令
3、变量叠加
x=123
x="$x"456
输出:123456
x=123
x=${x}789
输出:123789
4、变量查看
set
选项:
-u 如果设定此选项,调用未声明变量时会报错(默认无任何提示)
set能够查询到系统中所有正在运行的变量,除了系统默认已有的环境变量还有自己定义的变量。
例1:set命令,查看所有变量
例2:set -u命令,不存在的变量会报错。
5、删除变量
unset 变量名
删除变量
例1:unset x命令,删除变量
Bash变量之环境变量
执行bash命令可以进入当前Shell的子Shell,用exit命令从子Shell退回到父Shell中,可以通过pstree命令查看。
环境变量与用户自定义变量的区别:
-
环境变量是全局变量,在子Shell中也可以调用
-
用户自定义变量是局部变量
对系统生效的环境变量名和变量作用是固定的。
1、设置环境变量
export 变量名=变量值
或
变量名=变量值
export 变量名
例1:export e='环境变量'命令,设置环境变量。
使用set或者env命令查看设置的环境变量。
2、查看环境变量
set
查看所有变量
env
查看环境变量
例1:env命令,查看系统内的环境变量。
例2:bash命令,由于环境变量是全局变量,所以在子bash中也可以看到。
设置两个变量x和y,其中前者是普通变量,后者是环境变量,可以使用set命令进行查看。
都能够成功输出变量的值。
使用bash命令进入子Shell,再次使用set命令查看或者输出两个变量的值。
可以看到前者无值。
3、删除环境变量
unset 变量名
删除环境变量
4、常用环境变量
-
HOSTNAME:主机名
-
SHELL:当前的shell
-
TERM:终端环境
-
HISTSIZE:历史命令
-
SSH_CLIENT:当前操作环境是用ssh连接的,这里记录客户端IP
-
SSH_TTY:ssh连接的终端时pts/1
-
USER:当前登录的用户
注意:建议将环境变量用大写字母表示,以区分普通变量。
例1:echo $SHELL命令,输出SHELL环境变量的值。
5、PATH环境变量
意思就是执行ls等系统命令,不需要敲入该命令的绝对路径就能执行,是因为去从PATH路径中找的。
可以通过echo $PATH命令查看PATH路径。
如果要将环境变量永久生效,需要将其写入到文件中。
PATH变量:系统查找命令的路径
echo $PATH
查看PATH环境变量
PATH="$PATH":/root/sh
增加PATH变量的值
例1:echo $PATH命令,查看PATH路径,其中各个路径通过冒号分隔。
例2:PATH="$PATH":/root/sh命令,添加PATH路径,其中"$PATH"指的是PATH变量的值,":"指的是用来分隔PATH路径的标志,"/root/sh"指的是要添加到PATH中的路径。
6、PS1环境变量
echo $PS1
查看PS1环境变量的值
PS1变量
命令提示符设置。
\d:显示日期,格式为“星期 月 日”
\H:显示完整的主机名,如默认主机名“localhost.localdomain”
\t:显示24小时制时间,格式为“HH:MM:SS”
\A:显示24小时制时间,格式为“HH:MM”
\u:显示当前用户名
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
\$:提示符。如果是root用户显示提示符为“#”,如果是普通用户会显示提示符为“$”
例1:echo $PS1命令,查看PS1环境变量的值
例2:PS1='[\u@\A \w]\$'命令,修改PS1环境变量的值
Bash变量之语系变量
即当前系统所使用的语言,如中文、英文等。
1、当前语系查询
locale
查看当前系统语系
LANG:定义系统主语系的变量
LC_ALL:定义整体语系的变量
例1:locale命令,查看当前系统语系。
2、语系变量LANG
echo $LANG
查看系统当前语系
locale -a | more
查看Linux支持的所有语系
例1:echo $LANG命令,查看系统当前语系。
例2:locale -a | more命令,查看Linux支持的所有语系。
3、查询系统默认语系
cat /etc/sysconfig/i18n
查询系统默认语系
其中echo $LANG是当前正在运行的环境的语系,而cat /etc/sysconfig/il8n是下次开机的语系。
例1:cat /etc/sysconfig/i18n命令,查看系统默认语系。
4、Linux中文支持
前提条件,正确安装的中文字体和中文语系。
什么情况下显示中文
-
如果有图形界面,可以正确支持中文显示
-
如果使用第三方远程工具,只要语系设定正确,可以支持中文显示,如XShell
-
如果使用纯字符界面,就必须使用第三方插件(如zhcon等)
Bash变量之位置参数变量
1、位置参数变量
主要是向脚本中传递需要使用的参数值,缺陷是不适合面向第三方用户,因为除了脚本编写人员之外其他人不清楚里面需要传几个参数。
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。 |
例1:$n,创建一个shell脚本,输入如下内容。
#!/bin/bash
#$0表示命令本身
order=$0
#$1表示输入的第一个参数
num1=$1
#$2表示输入的第二个参数
num2=$2
#打印
echo $order
echo $num1
echo $num2
运行脚本,打印结果如下:
例2:$*与$@
$*和$@命令必须被双引号("")引起来才有效。
如在运行test.sh 1 2 3后,"$*"为"1 2 3"(一起被引号包住),"$@"为"1" "2" "3"(分别被引号包住)
$*循环
#!/bin/bash
m=0
for i in $*
do
echo "参数$i"
m=$(($m+1))
done
echo "循环次数:$m"
"$*"循环
注意是用双引号引起的。
#!/bin/bash
m=0
for i in "$*"
do
echo "参数$i"
m=$(($m+1))
done
echo "循环次数:$m"
$@循环
#!/bin/bash
m=0
for i in $@
do
echo "参数$i"
m=$(($m+1))
done
echo "循环次数:$m"
"$@"循环
注意用双引号括起来的。
#!/bin/bash
m=0
for i in "$@"
do
echo "参数$i"
m=$(($m+1))
done
echo "循环次数:$m"
总结:$*、$@、"$@"都是循环n次,而"$*"是被当作一个字符串处理,只循环一次。
例3:$#
#!/bin/bash
echo "参数个数是:$#"
Bash变量之预定义变量
1、预定义变量
预定义变量 | 作用 |
---|---|
$? | 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
2、接收键盘输入
read [选项] [变量名]
选项:
-p “提示信息”,在等待read输入时,输出提示信息
-t 秒数,read命令由于会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数,read命令只接受指定的字符数,就会执行
-s 隐藏输入的数据,适用于机密信息的输入
例1:read -p命令,打印提示信息。
#!/bin/bash
#read -p命令输出提示信息
read -p "请输入您的名字:" name
#打印变量的值
echo "$name,您好"
例2: read -t 20,后面的20表示20秒,单位是秒。如果20秒后用户不输入信息,会自动继续执行。
#!/bin/bash
#read -p命令输出提示信息,并且等待20秒
read -p "请输入您的名字:" -t 20 name
#打印变量的值
echo "$name,您好"
例3:read -n 1,表示允许输入几个字符,后面的1可以改为其他数字,1表示只允许输入一个字符。
#!/bin/bash
#read -p命令输出提示信息,并且等待20秒
read -p "请输入您的性别:" -t 20 -n 1 sex
#打印变量的值
echo -e "\n"
echo "$sex"
例4:read -s passwd,表示输入内容隐藏。
#!/bin/bash
#read -p命令输出提示信息,并且等待20秒
read -p "请输入您的密码:" -t 20 -n 6 -s passwd
#打印变量的值
echo -e "\n"
echo "密码:$passwd"