变量的设定规则

1.等号两边不能直接跟空格

#不能这么写
name = 中国
#应该这么写
name=中国

2.可以使用let来为变量赋值.

let  a=1

 

3.变量名字只能是英文字母和数字,数字不能打头. 

4.变量内容若有空格符可已使用单引号或双引号将内容括起来.但是这两者有区别

    1.  双引号可以保持原有的内容.
      • name=中国
        
        str="we are $name"
        
        echo $str
        
        #输出结果为:
        we are 中国
    2. 单引号内的特殊字符变为一般字符
      1. 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[@]}

 

posted on 2018-12-24 00:03  程序员一学徒  阅读(143)  评论(0)    收藏  举报