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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/325177.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA课程设计

一&#xff1a;Java连接mysql数据库 1.1点击进入mysql jar包下载官网 MySQL :: MySQL Community Downloads 将下载好的压缩包进行解压 解压之后下图就是连接数据库所用到的jar包&#xff1a; 将jar包复制到IDEA所用的项目下&#xff0c;放置jar包的目录为lib&#xff0c;需要…

NSS刷题

[SWPUCTF 2021 新生赛]jicao 类型&#xff1a;PHP、代码审计、RCE 主要知识点&#xff1a;json_decode()函数 json_decode()&#xff1a;对JSON字符串解码&#xff0c;转换为php变量 用法&#xff1a; <?php $json {"ctf":"web","question"…

安装Nox夜神模拟器关闭了HyperV后Docker运行不了怎么办?

1.背景 为了模拟真机&#xff0c;尝试安装了Nox夜神模拟器&#xff0c; 安装过程要求关闭Hyper-V。当时只是在程序安装卸载中关闭了系统服务。以为到时勾选上就好了。操作路径&#xff1a;控制面板\所有控制面板项\程序和功能\启用或关闭Windows功能\Hyper-V。 后来卸载掉了夜神…

FreeRTOS的列表和列表项 list.c文件详解

列表、列表项的定义以及初始化 列表相当于链表&#xff0c;列表项相当于节点&#xff0c;FreeRTOS中的列表相当于一个双向环形链表。 列表使用指针指向列表项。一个列表&#xff08;list&#xff09;下面可能有很多个列表项&#xff08;list item&#xff09;&#xff0c;每个…

vivado仿真readmemb函数相对路径

目前常用的vivado工程的结构如下所示 prj-name|-xxx|-prj.sim|-sim_1|-behav|-modelsim|-tb_prj.do|-xsim|-prj.srcs|-sim_1|-new|-tb_prj.v|-tb_prj_mem.txt一般来说我们创建的testbench文件和新建的txt文件都会放在srcs->sim_1->new这个路径下面&#xff0c;但是我们在…

【PHP【实战版】系统性学习】——登录注册页面的教程,让编写PHP注册变成一个简单的事情

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

最美博客POETIZE个人博客系统源码

源码说明&#xff1a; POETIZE个人博客系统源码 | 最美博客 这是一个基于SpringBoot、Vue2和Vue3的开源项目&#xff0c;支持移动端自适应&#xff0c;并具备完善的前台和后台管理功能。 网站分为两个模块&#xff1a; 1. 博客系统&#xff1a;包括文章、表白墙、图片墙、收…

SpringBoot实现图片验证码

引入依赖 <dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version> </dependency>代码实现 package com.qiangesoft.captcha.controller;import com.wf.captcha.*…

【Linux】基础命令:进程、网络

systemctl命令 控制内置服务 systemctl start | stop | status | enable | disable 服务名 start | stop开启关闭&#xff0c;status状态&#xff0c;enable | disable开启关闭开机自启 date命令 查看系统时间 date [-d] [格式化字符串] date -d “1 day” %Y-%m-%d 修改时区…

Stable Diffusion:AI绘画的新纪元

摘要&#xff1a; Stable Diffusion&#xff08;SD&#xff09;作为AI绘画领域的新星&#xff0c;以其开源免费、强大的生成能力和高度的自定义性&#xff0c;正在引领一场艺术与技术的革命。本文旨在为读者提供Stable Diffusion的全面介绍&#xff0c;包括其原理、核心组件、安…

链表的经典面试题(数据结构详解)+顺序表和链表之间区别+计算机存储体系

前言 首先这里已经正式步入数据结构的知识&#xff0c;之前我们已经讲解了链表的使用&#xff0c;接下来我们需要的就是大量的练习&#xff0c;熟练掌握数据结构。下面的题型我们选择的都是链表的经典题型&#xff0c;面试题型&#xff0c;包含快慢指针&#xff0c;数形结合&am…

【qt】设计器实现界面

设计器实现界面 一.总体思路二.具体操作1.创建项目2.粗略拖放3.水平布局4.垂直布局5.修改名字6.转到槽7.实现槽函数 一.总体思路 创建项目粗略拖放水平布局垂直布局修改名称转到槽实现槽函数 二.具体操作 1.创建项目 这次咱们一定要勾选Generate form哦。 因为我们要使用设…

R语言数据探索与分析-碳排放分析预测

# 安装和加载需要的包 install.packages("readxl") install.packages("forecast") install.packages("ggplot2") library(readxl) library(forecast) library(ggplot2)# 数据加载和预处理 data <- read_excel("全年数据.xlsx") co…

感知机和神经网络

引入 什么是神经网络&#xff1f; 我们今天学习的神经网络&#xff0c;不是人或动物的神经网络&#xff0c;但是又是模仿人和动物的神经网络而定制的神经系统&#xff0c;特别是大脑和神经中枢&#xff0c;定制的系统是一种数学模型或计算机模型&#xff0c;神经网络由大量的人…

FANUC机器人工具坐标偏移的用法

一、工具坐标偏移的使用场景 在机器人位置不改变的情况下&#xff0c;工业机器人使用默认工具坐标系示教的一系列运动点位&#xff0c;要保持原本点位位置不变的情况下&#xff0c;改变机器人工具坐标的参数&#xff0c;就要用到机器人坐标转化的功能。在FANUC机器人上体现为机…

通过mvn archetype 创建一个spring boot start 工程

mvn archetype https://maven.apache.org/archetype/index.html 遇到的问题 对于想自定义一个spring-boot-start的同学,比如 Springboot自定义Starter启动器 整个过程很繁琐。 定义属性开关增加 spring boot test start插件定义自动装载 spring.factories or org.springfra…

关于一致性,你该知道的事儿(上)

关于一致性&#xff0c;你该知道的事儿&#xff08;上&#xff09; 前言一、缓存一致性二、内存模型一致性三、事务一致性四、分布式事务一致性4.1 分布式系统的一些挑战4.2 关于副本的一些概念4.3 分布式事务之共识问题4. 3.1 PC(two-phase commit, 2PC)4.3.2 Raft 三、后记参…

【牛客】SQL201 查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t

1、描述 有一个薪水表&#xff0c;salaries简况如下&#xff1a; 请你查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t&#xff0c;以上例子输出如下&#xff1a; 2、题目建表 drop table if exists salaries ; CREATE TABLE salaries ( emp_no int(11) NOT N…

python数据分析——pandas数据结构2

参考资料&#xff1a;活用pandas库 导入基础数据 # 导入库 import pandas as pd # 读取数据集 dfpd.read_csv(r"..\data\scientists.csv") df.head() 1、DataFrame DataFrame是Pandas中最常见的对象。可以把它看作python存储电子表格式数据的方式。Series数据结构…

基于单片机的温度控制系统设计(51基础版)-设计说明书

本论文设计了一种基于51单片机的温度控制系统&#xff0c;该系统具备以下主要功能&#xff1a;首先&#xff0c;通过温度传感器实时检测环境温湿度&#xff0c;以获取准确的温度数值。其次&#xff0c;通过按键设置温度阈值&#xff0c;用户可以根据需求自行调整控制温度的上限…