Shell编程规范与变量

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" | 当月最后一天 |

相关推荐
麻花201323 分钟前
WPF学习之路,控件的只读、是否可以、是否可见属性控制
服务器·前端·学习
一只哒布刘1 小时前
RHCE-DNS域名解析服务器
运维·服务器
醇氧1 小时前
ab (Apache Bench)的使用
linux·学习·centos·apache
千城丶Y1 小时前
GoogleCloud服务器的SSH连接配置
服务器·ssh·googlecloud
华纳云IDC服务商1 小时前
怎么选择香港服务器的线路?解决方案
服务器·网络·香港服务器
sss-web12261 小时前
4.远程访问及控制
运维·服务器
罗克米2 小时前
通过脚本,发起分支合并请求和打tag
github
EasyCVR2 小时前
GA/T1400视图库平台EasyCVR视频融合平台HLS视频协议是什么?
服务器·网络·人工智能·音视频
moneyxjj2 小时前
Linux各种解压命令汇总
linux·运维·服务器
白白♛~2 小时前
网络管理之---3种网络模式配置
linux·服务器·网络