变量的设定规则
1.等号两边不能直接跟空格
#不能这么写 name = 中国 #应该这么写 name=中国
2.可以使用let来为变量赋值.
let a=1
3.变量名字只能是英文字母和数字,数字不能打头.
4.变量内容若有空格符可已使用单引号或双引号将内容括起来.但是这两者有区别
- 双引号可以保持原有的内容.
-
name=中国 str="we are $name" echo $str #输出结果为: we are 中国
-
- 单引号内的特殊字符变为一般字符
-
name=中国 str="we are $name" echo $str #输出结果为: we are $name
-
- 双引号可以保持原有的内容.
5.可以用跳脱字符'/'将特殊字符变为一般字符.
6..将命令结果赋值给变量 有两种方式第一种$(),第二种` `
a=$(ls -l /etc) #使用$()
b=`ls-l /etc` #使用``
将反引号中的内容当做shell命令来执行.$(命令)和反引号的效果一样.
#用反引号` ` n=`date` echo $n #结果为 Sun Dec 23 23:16:41 CST 2018 #用$() m=$(date) echo $m #结果为 Sun Dec 23 23:16:41 CST 2018
7.如果该变量要在其他程序中使用可以使用export把它升级为环境变量,即全局变量
name="中国'' export name
8.通常大写字母表示系统变量,自己写的变量可以用小写字母表示
9.变量类型默认为字符串,如果不指定类型1+2只能当做字符串来看.
10.env命令列出所有的环境变量,set命令显示所有的环境变量和自定义变量.
变量的引用
${变量名}称做是变量的引用.
echo ${变量名} 查看变量的值.
${变量名}在部分情况下可以省略为$变量名,但是这个变量名后边不能加任何东西.$name 可以 $name123 不行
变量的作用范围
变量的默认作用范围:只生效于当前shell下.
我们知道当我们用bash 一个文件的时候,会打开一个子进程并在子进程中执行,可是我现在有个需求在一个进程中执行,该如何操作
name="中国" #以下是shell文件 1.sh echo $name #我们使用source 来执行shell文件,这样就可以取到name变量了 source 1.sh
如果该变量要在子shell中使用可以使用export
unset变量删除
环境变量
全局环境变量对于shell会话和所有生成的子shell都是可见的。 局部变量则只对创建它们的shell可见。
查看环境变量的方法 env或printenv
$PATH,这个是命令搜索路径,当我们在shell中输入一个命令的时候,它回去PATH中寻找,路径之间用;隔开
$PS1 设置shell提示符的
#好看的提示符 PS1='`a=$?;if [ $a -ne 0 ]; then a=" "$a; echo -ne "\[\e[1A\e[$((COLUMNS-2))G\e[31m\e[1;41m${a:(-3)}\]\[\e[0m\e[7m\e[2m\r\n\]";fi`${debian_chroot:+($debian_chroot)}\[\e[1;33m\]\u\[\e[1;31m\]@\[\e[1;35m\]\h\[\e[1;32m\][\t]\[\e[1;31m\]:\[\e[1;36m\]\w\[\e[1;34m\]\$\[\e[0;39m\]' # 把上边的变量写入到.bashsarc文件中
环境变量保存的路径:
# 以/etc开头的文件 保存的环境变量可以供许多用户使用 # 以~ 开头的文件,保存的华金变量仅能当前用户用 /etc/profile /etc/profile.d/ # 这个先不考虑 ~/.bash_profile ~/.bashrc /etc/bashrc # su -root 配置文件的执行顺序 /etc/profile --->~/.bash_profile--->~/.bashrc--->/etc/bashrc # su root 配置文件的执行顺序~/.bashrc--->/etc/bashrc
修改配置文件后,如何让他立即生效:
方法有二 # 1.输入exit,退出当前shell # 2.输入 source 配置文件的路径
预定义变量
$$:目前这个shell的进程代号(即pid)
[root@localhost shell]# echo $$; 8411
$?:检查上一个命令是否执行成功.成功为0,不成功为非0.
$0 检查当前shell的脚本的文件名.
位置变量
如果一个shell脚本需要接受两个外边传的参数,这时候就要用上位置变量了,$1 代表第一个位置变量,第10个以上的位置变量要这么写${10}
# shell文件
#!/bin/bash echo $1 echo $2
结果:

export: 把自定义变量转换为环境变量.
readonly : 声明静态变量,静态变量不能被unset.该内容不可被更改.
read: 读取控制台输入的值.
-p 给用户的提示符
-t 指定用户写入的时间,如果没有在规定的时间内写入该read就读不到值
#sheel脚本中 #!/bin/bash read -p "请输入您的国家" -t 10 country echo $country
在控制台
[root@localhost shell]# sh text.sh 请输入您的国家china china
declare和typeset:声明变量的类型
-a 将变量定义为数组
-i 将变量声明为整数类型
-x 用法和export一样,声明为环境变量.
-r 将变量声明为readonly.
[root@localhost shell]# declare -i num=30+20+50 [root@localhost shell]# echo $num 100
alias
给指令其一个别名
alias lm='ls -al |more'
以后只要在命令行中敲出lm, 系统就会执行 ls -al |more 命令.
取消命名 :
unalias lm
设定变量的默认值
假设我们有这种情况:如果name有值我们就用name的值,如果没有就用默认值
[root@localhost shell]# echo $name [root@localhost shell]# username=${name-小明} #减号后边的就是默认值 [root@localhost shell]# echo $username 小明
但是我们要注意这么一种情况,如果一个变量提前已经是空字符串了,那么你再设置默认值是不起作用的
[root@localhost shell]# pwd='' [root@localhost shell]# echo $pwd [root@localhost shell]# password=${pwd-123} [root@localhost shell]# echo $password #为空字符串
这时候你需要用冒号强制设置默认值
[root@localhost shell]# password=${pwd:-123} #用冒号强制设置默认值 [root@localhost shell]# echo $password 123
如果a之前没有定义,给a一个默认值,结果:b会等于默认值,但是a还是没定义
[root@localhost shell]# b=${a-aa} [root@localhost shell]# echo "b=$b,a=$a" b=aa,a= #b等于默认值,a还是没有定义或空字符串
如何让a,b都等于默认值呢,只有用等号了.
如果a之前没有定义,a,b都等于默认值
[root@localhost shell]# unset b [root@localhost shell]# unset a [root@localhost shell]# b=${a=c} [root@localhost shell]# echo "b=$b.a=$a" b=c.a=c
当a定义了时,=后的内容就不起作用了
[root@localhost shell]# a=aa [root@localhost shell]# b=${a=cc} [root@localhost shell]# echo "a=$a,b=$b" a=aa,b=aa
declare 定义变量的数据类型
declare 中文意思是宣告的意思,在这里定义它的数据类型和typeset的功能一样

你会发现结果并不是6,这算是因为如果你不定义数据类型默认情况下都是字符串
root@iZj6c57vusqd7tt61aplasZ:~/a# declare -i sum=1+2+3 root@iZj6c57vusqd7tt61aplasZ:~/a# echo $sum 6
#declare 的基本用法 declare [-aixr] 变量名 # -a 将后边的变量定义为数组 # -i 将后边的变量定义为整数类型 # -x 将后边的变量定义为环境变量和export的作用一样’ # -r 将后边的变量变为只读类型,不可更改
默认情况下
1.变量的数据类型为字符串.
2. 在bash中数字只能计算整数.
变量的运算
变量的运算主要有这么几种形式
1. expr
wm_server@ip-172-31-0-226:~/zsy$ expr 3 + 4 7
当你要赋值给某个变量时需要这样
wm_server@ip-172-31-0-226:~/zsy$ num=$(expr 3 + 4) wm_server@ip-172-31-0-226:~/zsy$ echo $num 7
2.$(())
wm_server@ip-172-31-0-226:~/zsy$ echo $((1+2))
3
3.$[]
数组
定义数据
在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔。
ipts=(1 2 3)
Shell 是弱类型的,它并不要求所有数组元素的类型必须相同,例如:
arr=(20 56 "http://cctv.net/shell/")
显示数组的元素
${array_name[index]}
# 显示数组中所有的元素 echo ${ipts[@]} 或 ${ipts[*]} # 显示数组中的第一个元素 echo ${ipts[0]}
# 显示数组中的最后一个元素
echo ${ipts[-1]}
# 统计数组中有多少个元素?
echo ${#ipts[@]}
浙公网安备 33010602011771号