shell脚本--变量与数组

时间:2023-01-17 15:33:45

Linux中的变量有环境变量和用户自定义变量,关于环境变量,可以查看这篇博客:linux环境变量

本文主要针对的是用户在shell脚本中定义的变量,但是环境变量也可以在shell脚本中使用。

普通变量

注意事项:

  1. 变量名以英文字母或者下划线开头,但是不能以数字开头
  2. 变量名区分大小写
  3. 变量名与等号之间,等号与变量值之间不要有空格
  4. 只有在使用变量的值的时候,才在变量名之前加$,其他情况,比如删除、赋值、循环迭代都不用加$
  5. 如果一行只有一条命令,则每一行不用以分号结尾,每一条命令以换行分隔
  6. 如果一行有多条命令,则每一条命令以分号分隔,但建议每行只有一条命令
#!/bin/bash
#文件名:test.sh
name="beyond"
echo $name

  执行脚本:

ubuntu@ubuntu:~$ ./test.sh
beyond
ubuntu@ubuntu:~$ 

  

  有时候在使用变量的时候,变量名后面会跟着一些字符,如果这些字符与变量名之间没有间隔,那么,这些字符也将被认为是变量的一部分,即$nameHello,解释器回去找$nameHello,而不是找$name,可已使用两种方法,一种是使用空格分隔,另外一种使用花括号将变量名括起来(不要将$括起来)。如下例

#!/bin/bash
#文件名:test.sh
name="beyond"
echo "one",$name
echo "two",$nameHello
echo "three",$name hello
echo "four",${name}hell

  执行脚本:

ubuntu@ubuntu:~$ ./test.sh
one,beyond
two,
three,beyond hello
four,beyondhell

  

  从用户键盘读取数据并赋值给变量,使用:read [-p "提示信息"] 变量名

#!/bin/bash
#文件名:test.sh

#输出一段话,并等待用户输入,输入的内容赋值给后面的变量
read -p "please input your name:" name
echo "welcome ${name}"

  执行脚本:

ubuntu@ubuntu:~$ ./test.sh
please input your name:beyond
welcome beyond
ubuntu@ubuntu:~$ 

  

  单引号与双引号的区别:

  1、在单引号中,变量不能被解析;在双引号中变量可以被解析。

  2、转义字符在单引号和双引号中都不会转义,反引号的作用是将反引号括起来的命令(括起来的内容会被当成命令执行),然后将结果赋值给一个变量。

  注意,使用反引号将命令括起来之后,如果不将运行整个命令赋值给一个变量,那么就会将反引号中的命令的执行结果当成shell命令执行。

#!/bin/bash
#文件名:test.sh

name="beyond"
#双引号括起来的变量能解析
echo one,"$name"

#双引号括起来的变量不能解析,会输出变量名
echo two,'$name'

#转义字符在单引号和双引号中都不会转义
echo three,"$name\t hello"
echo four,'$name\t hello'

#echo `${name} \t hello`
#上面这条命令会出错,因为bash会将beyond \t hello当做shell命令执行

str=`echo $name \t hello`
echo $str

str=`date`
#date是在命令行中获取当前时间
echo "current time is $str"  

  执行脚本:

ubuntu@ubuntu:~$ ./test.sh
one,beyond
two,$name
three,beyond\t hello
four,$name\t hello
beyond t hello
current time is 2018年 01月 07日 星期日 18:50:59 CST

  变量的删除使用unset 变量名,注意此时变量名之前不要加$符号

#!/bin/bash
#文件名:test.sh

name="beyond"

echo one,"$name"

//使用unset来删除变量
unset name

echo $name

  执行脚本:

ubuntu@ubuntu:~$ ./test.sh
one,beyond

ubuntu@ubuntu:~$ 

 

位置变量:

咱们平时使用ls 查看当前目录下的文件时,常常会带-l -a -i等参数,这些参数就是位置变量,使用这些的方法:用$加数字(0-9)来获取,如果数字大于9时,则会使用数字的最高位所代表的位置变量,然后这个位置变量会拼接上数字剩下的部分,所以说shell命令行最多可以传递9个参数(如果参数过多,可以将多个参数连接为一个参数来扩充),也可以使用${11}来获取第11个位置参数

#!/bin/bash
#文件名:test.sh
echo $0
echo $1,"  ",$2,"  ",$3,"  ",$4,"  ",$5
echo $6,"  ",$7,"  ",$8," ",$9,"  ",$10
echo $11,"  ",$12

  执行脚本:

ubuntu@ubuntu:~$ ./test.sh a b c d e f g h i j k
./test.sh
a,  ,b,  ,c,  ,d,  ,e
f,  ,g,  ,h, ,i,  ,a0
a1,  ,a2
ubuntu@ubuntu:~$ 

  

预定义变量:

预定义变量名 含义
$0或者${0} 当前执行的进程名/脚本名/程序名
$#或者${#} 命令行中位置参数的总数量
$*或者${*} 所有位置参数的内容
$?或者${?} 上一条命令执行的返回结果,0表示正常,非0表示异常或出错


  

#!/bin/bash
#文件名:test.sh

echo "进程名:"$0
echo "位置参数的数量:"$#
echo "所有位置参数的内容:"$*

#执行一条非法语句,执行异常,返回非0
`echo "hello world"`
echo "上一条命令的执行结果:"$?

#执行一条合法语句,正常运行完毕,返回0
str=`echo "hello world"`
echo "上一条命令的执行结果:"$?

  执行脚本:

ubuntu@ubuntu:~$ ./test.sh a b c d e f g
进程名:./test.sh
位置参数的数量:7
所有位置参数的内容:a b c d e f g
./test.sh: line 8: hello: command not found
上一条命令的执行结果:127
上一条命令的执行结果:0
ubuntu@ubuntu:~$ 

  

数组