Shell
什么是Shell?
就是与内核沟通的界面、应用程序等等。比如你要播放音乐,你的计算机通过你在Shell输入的打开音乐的命令,Shell在告诉操作系统的内核用户希望打开音乐,内核在通过cpu调度、内存管理、磁盘输入输出等工作,将硬件调动,这时硬件声卡才会工作,硬件才是实际的工作者。
Shell(壳程序)是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个"命令解释器"的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
Shel的作用-->命令解释器---->翻译官介于系统内核与用户之间,负责解释命令行
Linux中有哪些Shell?
检查一下/etc/shells这个文件,里面就是Linux所包含的Shell。
最常用的就是bash、tcsh、csh、sh、nologin这些shell。这些shell都是依据Linux发展者的不同所创造出的不同版本。
- sh: UNIX最初使用的 shell,已经被bash所替换。
- bash: 基准于GNU的框架下发展出的Shell,是 sh 的扩展。
- csh: 语法有点类似于c语言的Shell。
- tcsh: 整合了csh,提供更多的功能。
- nologin: 奇怪的shell,这个shell可以让用户无法登录主机。
注:bash(/bin/bash)是目前大多数 Linux 版本采用的默认 Shell。
cat /etc/shells //linux中查看本机shell种类
为什么系统上合法的Shell要写入/etc/shells这个文件呢?
这是因为系统某些服务运行过程中,会去检查用户能够使用的Shell,而这些shell的查询就是借由**/etc/shells**这个文件。
[root@l1 ~]# vim /etc/shells
用户什么时候可以取得shell来工作?用户默认会取得哪一个shell?
当用户登录的时候,系统就会给我一个shell让我来用,而这个登录取得的Shell就记录在**/etc/passwd**这个文件内。
[root@l1 ~]# vim /etc/passwd
shell脚本的作用
- 自动化运维
- 批量化重复操作可以编写脚本结合计划任务自动周期运行
- 减轻管理员工作量
- 提高处理文本文件的速度
- 避免配置出错
Shel脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shel控制语句以完成更复杂的操作
Shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
- ......
编程语言类型
编译型 :C C++ JAVA GO 代码文件需要先编译后,程序才能执行
**解释型 :**SHELL PYTHON 代码是边解释边运行
Shell脚本
shell脚本功能:
- 完成自动化运维工作
- 批量完成重复操作
- 结合crontab完成周期性任务
Shell脚本的编写
vim XXX.sh
1)申明解释器
#!/bin/bash #!/bin/python若第一行为"#!/bin/bash",表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器
2)编写注释信息要以 # 号开头表示为注释,被注释的语句在脚本运行时是不会被执行的
3)编写执行语句按照顺序编写要执行的命令语句
[root@l1 ~]# vim xy101.txt
bash 和 phthon 运行xy101.txt
Shell脚本的运行
1) bash 或 sh 指定脚本文件运行,可无执行权限
绝对路径 或 相对路径 指定脚本文件运行,要求有执行权限以上两种方式 都是在shell环境中执行脚本
2)source 或 . 指定脚本文件运行,可无执行权限
会在当前shell环境中执行脚本
方法一:指定路径的命令,要求文件必须有 x 权限。
chmod +x /root/first.sh
指定绝对路径:/root/first.sh
指定相对路径:./first.sh
[root@l1 ~]# vim /root/first.sh
[root@l1 ~]# chmod +x /root/first.sh //给权限
[root@l1 ~]# ./first.sh //相对路径执行
当前的目录位于:
/boot
其中以 vml 开头的文件包括:
-rwxr-xr-x. 1 root root 6.5M 4月 30 23:08 vmlinuz-0-rescue-6e085db640b24c1e83a3beeced86cc0b
-rwxr-xr-x. 1 root root 6.5M 6月 28 2022 vmlinuz-3.10.0-1160.71.1.el7.x86_64
[root@l1 ~]# /root/first.sh //绝对路径执行
当前的目录位于:
/boot
其中以 vml 开头的文件包括:
-rwxr-xr-x. 1 root root 6.5M 4月 30 23:08 vmlinuz-0-rescue-6e085db640b24c1e83a3beeced86cc0b
-rwxr-xr-x. 1 root root 6.5M 6月 28 2022 vmlinuz-3.10.0-1160.71.1.el7.x86_64
[root@l1 ~]#
[root@l1 ~]#
方法二:指定Shell来解释脚本,不要求文件必须有 x 权限。
sh 脚本路径:sh first.sh
source 脚本路径:. first.sh 或者 source first.sh
[root@l1 ~]# bash first.sh //bash运行first.sh脚本
当前的目录位于:
/boot
其中以 vml 开头的文件包括:
-rwxr-xr-x. 1 root root 6.5M 4月 30 23:08 vmlinuz-0-rescue-6e085db640b24c1e83a3beeced86cc0b
-rwxr-xr-x. 1 root root 6.5M 6月 28 2022 vmlinuz-3.10.0-1160.71.1.el7.x86_64
[root@l1 ~]#
[root@l1 ~]# sh first.sh //sh运行first.sh脚本
当前的目录位于:
/boot
其中以 vml 开头的文件包括:
-rwxr-xr-x. 1 root root 6.5M 4月 30 23:08 vmlinuz-0-rescue-6e085db640b24c1e83a3beeced86cc0b
-rwxr-xr-x. 1 root root 6.5M 6月 28 2022 vmlinuz-3.10.0-1160.71.1.el7.x86_64
[root@l1 ~]#
[root@l1 ~]# source first.sh //source运行first.sh脚本
当前的目录位于:
/boot
其中以 vml 开头的文件包括:
-rwxr-xr-x. 1 root root 6.5M 4月 30 23:08 vmlinuz-0-rescue-6e085db640b24c1e83a3beeced86cc0b
-rwxr-xr-x. 1 root root 6.5M 6月 28 2022 vmlinuz-3.10.0-1160.71.1.el7.x86_64
[root@l1 boot]#
[root@l1 opt]# . first.sh
管道操作 |
将管道符号"|"左侧的命令输出的结果,作为右侧命令的输入(处理对象)
同一行命令中可以使用多个管道。
ps aux | wc -l
echo "abc123" | passwd --stdin zhangsan
[root@l1 opt]# ps aux | wc -l
164
[root@l1 opt]#
[root@l1 opt]# echo 1 | passwd --stdin admin
更改用户 admin 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@l1 opt]#
重定向
交互式硬件设备
标准输入: 从该设备接收用户输入的数据
标准输出: 通过该设备向用户输出数据
标准错误输出: 通过该设备报告执行出错信息
[root@l1 opt]# echo 1 | passwd --stdin admin
更改用户 admin 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@l1 opt]#
[root@l1 opt]# cat /etc/passwd | grep "/bin/bash$"
root:x:0:0:root:/root:/bin/bash
admin:x:1000:1000:admin:/home/admin:/bin/bash
[root@l1 opt]#
重定向符号
|-----------------|-----------------------------------|
| < | 重定向输入,从文件读取数据 |
| > | 重定向输出,将正常输出的数据信息保存到文件,并覆盖原文件内容 |
| >> | 重定向追加,将正常输出的数据信息追加保存到文件末尾 |
| 2> | 重定向错误输出,将错误输出的数据信息保存到文件,并覆盖原文件内容 |
| 2>> | 重定向错误追加,将错误输出的数据信息追加保存到文件末尾 |
| &> >& | 混合输出,将正常和错误输出的数据信息都保存到文件,并覆盖原文件内容 |
| &>> | 混合追加,将正常和错误输出的数据信息都追加保存到文件末尾 |
| 命令 > 文件 2>&1 | 效果等效于混合输出 |
ls -lh 标准输出 到屏幕 1 --> 屏幕
ls -lh > test.txt 重定向输出 到 test.txt 1 --> test.txt
2>&1 错误输出 重定向到 标准输出 2 --> 1
< 重定向输入,从文件读取数据
[root@l1 opt]# echo 1 | passwd --stdin admin
更改用户 admin 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@l1 opt]# passwd --stdin admin < password.txt //重定向输入,从文件读取数据
更改用户 admin 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@l1 opt]#
> 重定向输出,将正常输出的数据信息保存到文件,并覆盖原文件内容
>> 重定向追加,将正常输出的数据信息追加保存到文件末尾
>
[root@l1 opt]# ls
first.sh rh
[root@l1 opt]# echo 123123
123123
[root@l1 opt]# echo 123123 > password.txt //重定向输出,将正常输出的数据信息保存到文件,并覆盖原文件内容
[root@l1 opt]# cat password.txt
123123
[root@l1 opt]# echo 123456 > password.txt
[root@l1 opt]# cat password.txt
123456
[root@l1 opt]#
[root@l1 opt]# echo 123123 >> password.txt //重定向追加,将正常输出的数据信息追加保存到文件末尾
[root@l1 opt]# cat password.txt
123456
123123
[root@l1 opt]#
2> 重定向错误输出,将错误输出的数据信息保存到文件,并覆盖原文件内容
2>> 重定向错误追加,将错误输出的数据信息追加保存到文件末尾
[root@l1 opt]# echo 123 > password.txt
[root@l1 opt]# cat password.txt
123
[root@l1 opt]# ech 1 2> password.txt //重定向错误输出,将错误输出的数据信息保存到文件,并覆盖原文件内容
[root@l1 opt]# cat password.txt
bash: ech: 未找到命令...
[root@l1 opt]#
[root@l1 opt]# echo 123 > password.txt
[root@l1 opt]# cat password.txt
123
[root@l1 opt]# ech 1 2>> password.txt //重定向错误追加,将错误输出的数据信息追加保存到文件末尾
[root@l1 opt]# cat password.txt
123
bash: ech: 未找到命令...
[root@l1 opt]#
&> >& 混合输出,将正常和错误输出的数据信息都保存到文件,并覆盖原文件内容
[root@l1 opt]# echo 123 &> password.txt
[root@l1 opt]# cat password.txt
123
[root@l1 opt]# echo 123 >& password.txt
[root@l1 opt]# cat password.txt
123
[root@l1 opt]# ech 1 &> password.txt
[root@l1 opt]# cat password.txt
bash: ech: 未找到命令...
[root@l1 opt]# ech 1 >& password.txt
[root@l1 opt]# cat password.txt
bash: ech: 未找到命令...
[root@l1 opt]#
&>> 混合追加,将正常和错误输出的数据信息都追加保存到文件末尾
[root@l1 opt]# echo 123 > password.txt
[root@l1 opt]# cat password.txt
123
[root@l1 opt]# echo 1234 &>> password.txt
[root@l1 opt]# cat password.txt
123
1234
[root@l1 opt]#
[root@l1 opt]# cat password.txt
123
1234
[root@l1 opt]# ech 1 &>> password.txt
[root@l1 opt]# cat password.txt
123
1234
bash: ech: 未找到命令...
[root@l1 opt]#
命令 > 文件 2>&1 效果等效于混合输出
[root@l1 opt]# echo 1 2>&1 password.txt
1 password.txt
[root@l1 opt]# cat password.txt
1
[root@l1 opt]# ech 123 2>&1 password.txt
bash: ech: 未找到命令...
[root@l1 opt]#
ls -lh > xy101.txt 2>&1
[root@l1 opt]# ls -lh > xy101.txt 2>&1
[root@l1 opt]# cat xy101.txt
总用量 4.0K
-rw-r--r-- 1 root root 0 5月 7 21:18 first.sh
-rw-r--r-- 1 root root 2 5月 7 22:21 password.txt
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
-rw-r--r-- 1 root root 0 5月 7 22:37 xy101.txt
[root@l1 opt]#
ls -lh 标准输出 到屏幕 1 --> 屏幕
ls -lh > test.txt 重定向输出 到 test.txt 1 --> test.txt
2>&1 错误输出 重定向到 标准输出 2 --> 1
变量:
变量的作用:
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义变量值:能够根据用户设置、系统环境的变化而变化
变量的分类:
自定义变量: 由用户自己定义、修改和使用
环境变量: 由系统维护,用于设置工作环境
位置变量: 通过命令行给脚本程序传递参数
预定义变量: Bash中内置的一类变量,不能直接修改
定义变量:
1)格式: 变量名=变量值
变量命名规则:以字母或下划线开头,区分大小写
product=benet
version=6.0
name="zhang san"
2)read -p "提示内容" 变量名 #从键盘输入中获取变量值
[root@l1 opt]# ABC123=123456
[root@l1 opt]# abc123=123456
[root@l1 opt]# _123=123456
[root@l1 opt]#
[root@l1 opt]# echo $_123
123456
[root@l1 opt]# echo $ABC123
123456
[root@l1 opt]# echo $abc123
123456
[root@l1 opt]#
$a $b互换
[root@l1 opt]# echo $a $b
my tmt
[root@l1 opt]# c=$a
[root@l1 opt]# echo $c
my
[root@l1 opt]# a=$b
[root@l1 opt]# b=$c
[root@l1 opt]# echo $a
tmt
[root@l1 opt]# echo $b
my
[root@l1 opt]#
[root@l1 opt]# read -p "请输入变量myname的值" myname
请输入变量myname的值cywl
[root@l1 opt]# echo $myname
cywl
[root@l1 opt]#
[root@l1 opt]# read -p "请输入变量myname的值:" -t 5 myname //设置5s时间,超时自动退出
请输入变量myname的值:[root@l1 opt]#
[root@l1 opt]#
[root@l1 opt]#
查看变量的值
格式:echo $变量名
echo $product
echo $product $version
echo ${product}40
[root@l1 opt]# a=my
[root@l1 opt]# b=tmt
[root@l1 opt]# echo $a$b
mytmt
[root@l1 opt]# echo $a $b
my tmt
[root@l1 opt]# echo ${a}tmt
mytmt
[root@l1 opt]#
引号的作用
赋值时使用引号
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号:命令替换,提取命令执行后的输出结果,`...`和$(...)作用相同
|----------------|-----------------------|
| "XXX" | 会把看作为引用XXX变量值的特殊符号 |
| 'XXX' | 会把看作为一个普通字符,不会引用变量的值 |
| `...` $(...) | 提取里面的命令执行后的结果 |
[root@l1 opt]# echo $a
tmt
[root@l1 opt]# echo "$a"
tmt
[root@l1 opt]# echo '$a'
$a
[root@l1 opt]#
ldd `which sshd` 和 ldd $(which sshd)是一样的效果
[root@l1 opt]# ldd `which sshd`
linux-vdso.so.1 => (0x00007fffc6c92000)
libfipscheck.so.1 => /lib64/libfipscheck.so.1 (0x00007f488d5b2000)
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f488d3a7000)
libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f488d17e000)
libpam.so.0 => /lib64/libpam.so.0 (0x00007f488cf6f000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f488cd48000)
libsystemd.so.0 => /lib64/libsystemd.so.0 (0x00007f488cb17000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f488c6b4000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f488c4b0000)
libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007f488c25b000)
liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007f488c04c000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f488be49000)
libz.so.1 => /lib64/libz.so.1 (0x00007f488bc33000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f488b9fc000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f488b7e2000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f488b595000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f488b2ac000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f488b079000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f488ae75000)
libc.so.6 => /lib64/libc.so.6 (0x00007f488aaa7000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f488a88d000)
libcap-ng.so.0 => /lib64/libcap-ng.so.0 (0x00007f488a687000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f488a425000)
/lib64/ld-linux-x86-64.so.2 (0x00007f488da8a000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f488a220000)
libm.so.6 => /lib64/libm.so.6 (0x00007f4889f1e000)
librt.so.1 => /lib64/librt.so.1 (0x00007f4889d16000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f4889af0000)
liblz4.so.1 => /lib64/liblz4.so.1 (0x00007f48898e1000)
libgcrypt.so.11 => /lib64/libgcrypt.so.11 (0x00007f4889660000)
libgpg-error.so.0 => /lib64/libgpg-error.so.0 (0x00007f488945b000)
libdw.so.1 => /lib64/libdw.so.1 (0x00007f488920a000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f4888ff4000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4888dd8000)
libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007f4888bbb000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007f4888949000)
libssl3.so => /lib64/libssl3.so (0x00007f48886e6000)
libsmime3.so => /lib64/libsmime3.so (0x00007f48884be000)
libnss3.so => /lib64/libnss3.so (0x00007f4888185000)
libnssutil3.so => /lib64/libnssutil3.so (0x00007f4887f55000)
libplds4.so => /lib64/libplds4.so (0x00007f4887d51000)
libplc4.so => /lib64/libplc4.so (0x00007f4887b4c000)
libnspr4.so => /lib64/libnspr4.so (0x00007f488790e000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f488770b000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f48874fb000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f48872f7000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f48870f2000)
libelf.so.1 => /lib64/libelf.so.1 (0x00007f4886eda000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00007f4886cca000)
[root@l1 opt]#
[root@l1 opt]# ldd $(which sshd)
linux-vdso.so.1 => (0x00007ffca3b5e000)
libfipscheck.so.1 => /lib64/libfipscheck.so.1 (0x00007fb3fd12e000)
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fb3fcf23000)
libaudit.so.1 => /lib64/libaudit.so.1 (0x00007fb3fccfa000)
libpam.so.0 => /lib64/libpam.so.0 (0x00007fb3fcaeb000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fb3fc8c4000)
libsystemd.so.0 => /lib64/libsystemd.so.0 (0x00007fb3fc693000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fb3fc230000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fb3fc02c000)
libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007fb3fbdd7000)
liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007fb3fbbc8000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007fb3fb9c5000)
libz.so.1 => /lib64/libz.so.1 (0x00007fb3fb7af000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fb3fb578000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fb3fb35e000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fb3fb111000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fb3fae28000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fb3fabf5000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fb3fa9f1000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb3fa623000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fb3fa409000)
libcap-ng.so.0 => /lib64/libcap-ng.so.0 (0x00007fb3fa203000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fb3f9fa1000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb3fd606000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fb3f9d9c000)
libm.so.6 => /lib64/libm.so.6 (0x00007fb3f9a9a000)
librt.so.1 => /lib64/librt.so.1 (0x00007fb3f9892000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fb3f966c000)
liblz4.so.1 => /lib64/liblz4.so.1 (0x00007fb3f945d000)
libgcrypt.so.11 => /lib64/libgcrypt.so.11 (0x00007fb3f91dc000)
libgpg-error.so.0 => /lib64/libgpg-error.so.0 (0x00007fb3f8fd7000)
libdw.so.1 => /lib64/libdw.so.1 (0x00007fb3f8d86000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fb3f8b70000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb3f8954000)
libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007fb3f8737000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007fb3f84c5000)
libssl3.so => /lib64/libssl3.so (0x00007fb3f8262000)
libsmime3.so => /lib64/libsmime3.so (0x00007fb3f803a000)
libnss3.so => /lib64/libnss3.so (0x00007fb3f7d01000)
libnssutil3.so => /lib64/libnssutil3.so (0x00007fb3f7ad1000)
libplds4.so => /lib64/libplds4.so (0x00007fb3f78cd000)
libplc4.so => /lib64/libplc4.so (0x00007fb3f76c8000)
libnspr4.so => /lib64/libnspr4.so (0x00007fb3f748a000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007fb3f7287000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fb3f7077000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fb3f6e73000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fb3f6c6e000)
libelf.so.1 => /lib64/libelf.so.1 (0x00007fb3f6a56000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00007fb3f6846000)
read命令获取输入内容
方法一:
read -p "提示信息" 变量名
echo $变量名
方法二:echo -n "提示信息"
read 变量名
echo $变量名
[root@l1 opt]# read -p "请输入变量myname的值" myname
请输入变量myname的值cywl
[root@l1 opt]# echo $myname
cywl
[root@l1 opt]#
[root@l1 opt]# read -p "请输入变量myname的值" myname
请输入变量myname的值cywl
[root@l1 opt]# echo $myname
cywl
[root@l1 opt]#
变量的作用范围:
默认情况下自定义的变量只能在当前shell环境中有效
让自定义的变量在所有shell环境中有效的方法:
1)在 /etc/profile 文件中定义 export 变量名=变量值
source /etc/profile 立即生效 或 重新登录系统自动生效
2)在 /etc/bashrc 文件中定义 变量名=变量值切换 shell 环境自动生效
[root@l1 opt]# loginusers=$(who | wc -l)
[root@l1 opt]# echo $loginusers
1
[root@l1 opt]# export loginusers
[root@l1 opt]# echo $loginusers
1
[root@l1 opt]# bash
[root@l1 opt]# echo $loginusers
1
[root@l1 opt]#
再开另一个Shell环境
解决方法
[root@l1 opt]# vim /etc/bashrc
另一窗口
[root@l1 ~]# bash
[root@l1 ~]# echo $loginusers
2
[root@l1 ~]#
[root@l1 opt]# vim /etc/profile
整数运算
echo $(expr 整数1 运算符 整数2) $(expr $变量1 运算符 $变量2) + - \* / %
echo $[整数1 运算符 整数2] $[变量1 运算符 变量2] + - * / %
echo $((整数1 运算符 整数2)) $((变量1 运算符 变量2)) + - * / %
let a=10+5
let a++ 相当于 a=$[a+1]
let a-- 相当于 a=$[a-1]
let a+=2 相当于 a=$[a+2]
浮点数运算
echo '4.5+2.1' | bc
awk 'BEGIN{print 4.5+2.1}'
环境变量
env #查看当前shell环境中所有可用的环境变量
/etc/profile 如果修改此文件会作用于所有用户
~/.base_profile 用户独立的配置文件,修改这个文件只作用于当前用户,可以用来长期变更或设置环境变量
export PATH USER PWD HOME LANG HISTSIZE
常用环境变量:
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
echo $PATH //查看当前搜索路径
PATH="$PATH:/root" //将/root目录添加到搜索路径
export PATH="$PATH:/root" //输出为全局环境变量
只读变量
readonly 变量名=变量值 #只读变量不允许被修改变量值和删除变量
位置变量
./test.sh one two three four .... ten
$0 $1 $2 $3 $4 ${10}
#!/bin/bash
echo "$1" 位置1
echo "$2" 位置2
echo "${10}" 位置10
echo "$10" 位置1和0
echo "$*" 将所有项当成一个值
echo "$@" 所有项
echo "$0" 脚本自身
echo "$#" 后面参数的个数
预定义变量
|-----|-------------------------------------------------------------|
| $0 | 代表脚本本身 |
| $# | 代表脚本后面跟的位置参数的数量 |
| $? | 代表的是上一条Linux命令执行的返回状态码(0~255),0表示上一条命令执行正确,非0值则表示上一条命令执行异常 |
| \* | 默认代表脚本后面跟的所有参数,加上双引号后 "*" 会把所有参数看做一个整体 |
| @ | 默认代表脚本后面跟的所有参数,加上双引号后 "@" 还是会把每个参数看做 |
|-----------------------------------------------------------|--------|
| date +"%Y%m%d" | 当天日期 |
| date -d "1 day" +"%Y%m%d" | 昨天日期 |
| date +"%Y%m01" | 当月第一天 |
| date -d "1 month" +"%Y%m01" | 下个月第一天 |
| date -d "$(date -d "1 month" +"%Y%m01") -1 day" +"%Y%m%d" | 当月最后一天 |