shell是弱类型语言,原则上,不是特别强调shell变量,或者shell变量可以放很多常见内容,这点和传统的C/C++有 很大不同。shell变量也不需要提前定义,或者不牵扯到定义一说,需要时直接使用即可。
(1)首个字符必须为字母(a-z,A-Z)。
(2)中间不能有空格,可以使用下划线(_)。
(3)不能使用标点符号。
(4)不能使用bash里的关键字(可用help命令查看保留关键字)。
变量名和等号之间不能有空格! 否则会被Shell解释成命令和命令行参数。
#!/bin/bash
myint=1000
myfloat=3.14
mystring="hello world"
mychar=c
使用一个赋值过的变量,只要在变量名前面加美元符号即可:
echo $myint
echo $myfloat
echo $mystring
echo $mychar
echo "${mystring}hello bit"
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh
hello worldhello bit
注:在变量名外面加上${ },为了帮助解释器辨认清楚变量的边界。建议加上。
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
readonly mystring="hello world"
echo $mystring
mystring="hello bit"
echo $mystring
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh
hello world
./test.sh: line 5: mystring: readonly variable hello world
使用 unset 命令可以删除变量。
#!/bin/bash
mystring="hello world"
echo $mystring
unset mystring
echo $mystring
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh
hello world
本地变量
即是局部变量,仅在shell实例中有效,其他shell上的程序不能访问。可以用set命令显示当前进程的所有变量。
环境变量
所有的程序都可以访问环境变量。shell脚本也可以定义环境变量。环境变量可以被子进程继承。
shell变量
指的是shell程序设置的特殊变量,包括环境变量和局部变量。
注:环境变量可以被子进程所继承并显示出来,但是本地变量只在本地shell有效。看下面示例:
#!/bin/bash echo $myval
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh
[hb@MiWiFi-R1CL-srv test-shell]$ myval=100
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh
[hb@MiWiFi-R1CL-srv test-shell]$ echo $myval 100
我们在父shell定义了一个变量myval,但是运行test.sh程序,没有得出myval的值,说明myval只在父shell有效。
[hb@MiWiFi-R1CL-srv test-shell]$ export myval
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh
100
将myval设置成环境变量,子进程就可以访问了。
在shell中,将一切看作字符串,可以实现字符串的任意操作。并且不像C/C++,字符串必须括在双引号中,shell中的字符串即可以括在双引号中,也可以括在单引号中,也可以不括起来,直接使用。
shell的拼接字符串很简单,直接将信息写在一起就可以了。
#!/bin/bash
str1='hello '
str2=world
echo $str1$str2' good' [hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh
hello world good
用${# }可以获取字符串长度:
#str=$str1$str2
#echo ${#str}
#str=$str1$str2
echo ${str1:4}
echo ${str1:1}
echo ${str1:1,3}
echo ${str1:1,3,4}
[jinyuyu@localhost progammer]$ vim test.sh
[jinyuyu@localhost progammer]$ ./test.sh
o
ello
lo
o
用于匹配的字符成为通配符。
通配符* :匹配0个或多个任意字符
?:匹配一个任意字符
[ ] : 匹配方括号中任意一个字符的一次出现。
示例:创建100个文件:
for i in {1..100}
do
touch file$i
rm file$i #删除100个文件
done
命令代换
(1)反引号` `括起来的一般为一条命令,将命令的输出结果代换到当前命令行中。
date=`date +%Y:%m:%d`
echo $date
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh
2018:5:20
(2)$( )也可以作为命令代换,()中的内容一般为命令。它也是将()中命令的执行结果替换到当前命令行中。
date=$(date +%Y:%m:%d)
echo $date
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh
2018:5:20
算术代换
算术代换用(())
,在双括号中的执行规则一律按C处理。但是(())
中只能用+ - * / ()
运算符,并且只能做整数运算。
#!/bin/bash
myint=100
echo $myint
(( myint++ ))
echo $myint
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh
100
101
作为右值使用:
res=$(( ++myint ))
echo $myint
echo $res
[hb@MiWiFi-R1CL-srv test-shell]$ ./test.sh
100
101
和C语言不一样,Shell脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。
单引号中的内容不做任何替换,全部按照纯文本处理。
双引号中的内容会对部分做替换,并不是全部按照纯文本处理。
$加变量名可以取变量的值;
反引号仍表示命令替换;
echo "hello bit $mystr\\ \" \\ \` `date +%y:%m:%d`"
echo 'hello bit $mystr\\ \" \\ \` `date +%y:%m:%d`'
[jinyuyu@localhost progammer]$ vim test.sh
[jinyuyu@localhost progammer]$ ./test.sh
hello bit good\ " \ ` 18:07:05
hello bit $mystr\\ \" \\ \` `date +%y:%m:%d`