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值则表示上一条命令执行异常
$*默认代表脚本后面跟的所有参数,加上双引号后 "$*" 会把所有参数看做一个整体
$@默认代表脚本后面跟的所有参数,加上双引号后 "$@" 还是会把每个参数看做分隔成n份的参数列表,每个参数作为一个字符串返回,代表"$1" "$2" "$3" "$4"

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

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值