所有的脚本都要以#!/bin/bash
开头
如果要执行脚本要赋予 755 权限:chmod 755 脚本名
例如我要添加100个用户,如果是手动来执行命令来添加,估计会累死。所以这时候如果用脚本来实现就更方便了
bash是linux的标准shell,我们说的bash和shell都是指的一个东西。所以我们说的shell编程实际上就是指的linux编程或者bash编程
shell在定义变量的时候不需要加$
符号,在调用变量的时候需要加上$
符号
变量名是不能以数字开头的
此时,它会把5x=6
这一整条赋值语句当成一条linux命令
怎么记忆呢?例如:
123=456
这明显是不符合人的思考习惯的
注意:等号两边是不能加空格的
因为,linux命令是采取输入命令名字然后加上空格的形式。所以,如果左边加了空格的话,会把变量名当作linux命令
同理,右边也不行:
并且我们发现,因为jie
和cao
的中间有空格,所以需要使用引号括起来(如果引号里面的值没有特殊含义,那么使用单引号或双引号都可以;如果有例如$
这样的,使用双引号的话就会解析它,使用单引号就不解析)
字符串型、整型、数组、浮点型、日期型等等。但是,这些分类对于linux来说都不起作用,都默认是字符串型
1、用户自定义变量(本地变量)
2、环境变量
这种变量中主要保存的是和系统操作环境相关的数据。环境变量也可以自定义,但是对系统生效的环境变量名和变量作用是固定的
3、位置参数变量
这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
位置参数变量就是预定义变量的一种
4、预定义变量
是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
不能自己去新增加预定义变量。这种变量完全是系统确定好的
字符串型(所以不能直接进行加减乘除,要先进行转换)。例如:
x=5
y=6
z=$x+$y
echo $z
此时输出:
5+6
而不是我们以为的整数11
x=124
x="$x"456
echo $x
输出:
123456
set
使用set -u
命令,则会在使用没有定义的变量的时候报错unbound variable
env
可以查看到用户自定义的环境变量和系统默认的环境变量
unset name
因为删除变量并不是要删除这个变量的值,所以不需要加$
符号(如果加了就达不到删除变量的效果)
用户自定义变量只有在当前的Shell中生效(局部变量)
环境变量在当前Shell和这个Shell的所有子Shell中生效(全局变量)
输入bash
命令可以进入当前shell
的子shell
:
bash
我们可以通过以下命令来查看(进程树):
pstree
我们可以看到这里有两个bash,其中左边的bash是父shell,右边的bash是子shell
也就是说,我们通过远程命令连接(从图中的sshd守护进程可以看出),在父shell中执行了bash进入了子shell,然后在子shell中执行了pstree命令
exit
export 变量名=变量值
或
变量名=变量值
export 变量名
在父shell中定义的变量不能在子shell中删除
建议用户自定义的环境变量写成大写,因为Linux中的命令都是小写,把环境变量写成大写就不会和Linux命令产生冲突了
HOSTNAME
:主机名
SHELL
:当前的shell
TERM
:终端环境
HISTSIZE
:历史命令条数
SSH_CLIENT
:当前操作环境是用ssh连接的,这里记录客户端ip(注意,这里的SSH_CLIENT和我们在百度中搜ip得到的值是一样的)
SSH_TTY
:ssh连接的终端时pts/1
USER
:当前登录的用户
它的值是用冒号分割开的目录:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
这些目录是系统搜索命令的路径
在Linux中,执行可执行文件的常用方法是:用绝对路径(或者相对路径)去找到这个命令,然后按下回车。但是,我们在实际操作过程中出来没有这么操作过。例如,我们直接使用ls
就可以列出目录,而不需要使用/bin/ls
。原因就是这个$PATH
起了作用。当我敲入一个命令,它会在PATH中定义的这些路径里面一个一个去找,直到找到
而且当我们按下tab
键,它去PATH
路径里面搜索,然后自动补全这些命令或这文件名
PATH="$PATH":/root/otherPath
这句话实际上是使用了变量叠加(可以理解为字符串拼接)。即,双引号先把$PATH
变量解析,然后再和字符串:/root/otherPath
连接起来
PS1变量
命令提示符设置
例如:
普通用户的提示符是$
,超级用户的提示符是#
locale
可以看到,一些语系被赋值给了一些变量
其中,en_US是美式英文语系的意思,例如:
可以看到,红线划出的部分是英文显示
而如果是中文语系,则会会显示中文:
这些变量当中,最主要生效的就是变量:LANG
、LC_ALL
LANG
:定义系统主语系的变量
LC_ALL
:定义整体语系的变量
这两个变量中当前生效的变量是LANG
echo $LANG
locale -a | more
cat /etc/sysconfig/i18n
系统默认语系和前面所说的语系变量是有所不同的。系统默认语系是放在一个文件里面的(无论当前生效的语系是什么,只要下次一开机,立即生效的就是这个文件里面所保存的系统默认语系)
linux一切皆文件,放在文件里的才是永久生效的
对于第二点,指的是:例如我们使用xshell这类的远程工具,只要我们设置xshell的选项为中文语系即可(注意,安装操作系统的时候要选择支持中文语系)
举个例子:
#!/bin/bash
sum=$(( $1 + $2 ))
echo $sum
文件名为code1.sh
。此时,在终端输入:
./code1.sh 10 20
其中的./code1.sh
代表$0
得到结果:
30
举个例子:
#!/bin/bash
echo "\$* can shu shi : $*"
echo "\$@ can shu ye shi : $@"
echo "\$# can shu ge shu shi : $#"
文件名为code2.sh
。此时,在终端输入:
./code2.sh 1 2 3 4 5
得到结果:
$* can shu shi : 1 2 3 4 5
$@ can shu ye shi : 1 2 3 4 5
$# can shu ge shu shi : 5
举个例子:
#!/bin/bash
for x in "$*"
do
echo $x
done
for y in "$@"
do
echo $y
done
文件名为code3.sh
。此时,在终端输入:
./code3.sh 1 2 3 4
得到结果:
1 2 3 4
1
2
3
4
说明$*
的1 2 3 4
是一个整体,所以循环只执行一次;而$@
的1 2 3 4
四个,所以循环执行四次
例如:
#!/bin/bash
read -p "please input your name: " name
echo $name
文件名为code4.sh
。此时,在终端输入:
./code4.sh
echo -e "\n"
注意:-e
不能漏了,否则不能识别\n