Linux——Shell编程
来源:互联网 发布:淘宝卖家后台管理 编辑:程序博客网 时间:2024/05/25 08:11
Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。
Shell脚本可以让我们管理Linux操作系统变得更加方便,自动化。学会Shell编程可以让我们对Linux理解更加深入。
目前发行版一般使用的Shell是Bash。
Bash变量
bash变量是一种弱类型,默认为字符串类型。
分类
1.自定义变量
2.环境变量
3.预定义变量
变量的查看:set(查看所有变量)
[root@localhost myShell]# set | moreABRT_DEBUG_LOG=/dev/nullBASH=/bin/bashBASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepathBASH_ALIASES=()BASH_ARGC=()BASH_ARGV=()BASH_CMDS=()BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.dBASH_LINENO=()BASH_REMATCH=()BASH_SOURCE=()BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")...变量的删除:unset(删除指定变量)
自定义变量
自定义变量只对当前shell有效。
例如:
[root@localhost myShell]# var=var1[root@localhost myShell]# echo varvar等号前后不能存在空格。
变量叠加:
[root@localhost myShell]# echo $varvar1[root@localhost myShell]# var="$var"23[root@localhost myShell]# echo $varvar123
环境变量
对当前shell和其子shell都有效的变量。
我们需要注意的是系统自定义的环境变量,这些变量会对我们的操作系统环境产生变化。
有两种设置环境变量的方法:1.export
[root@localhost myShell]# var2=var2[root@localhost myShell]# export var2[root@localhost myShell]# bash[root@localhost myShell]# pstreesystemd─┬─NetworkManager───2*[{NetworkManager}] ├─abrt-watch-log ├─abrtd ├─anacron ├─atd ├─auditd───{auditd} ├─crond ├─dbus-daemon───{dbus-daemon} ├─firewalld───{firewalld} ├─login───bash ├─lsmd ├─lvmetad ├─master─┬─pickup │ └─qmgr ├─polkitd───5*[{polkitd}] ├─rngd ├─rsyslogd───2*[{rsyslogd}] ├─smartd ├─sshd─┬─sshd───sshd───bash │ └─sshd───bash───bash───pstree ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tuned───4*[{tuned}] └─wpa_supplicant[root@localhost myShell]# set | grep var2var2=var2在子shell中可以找到var2,但是找不到var变量。所以是环境变量。
2.declare声明变量类型为环境变量
[root@localhost myShell]# declare -x var3=var3选项-x表示环境变量。export实际上也是调用了这条命令,简化了语句。
默认的系统变量一般都是全大写。
常见环境变量:PATH, PS1等。
[root@localhost myShell]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/binPATH为命令的搜寻路径。
[root@localhost myShell]# echo $PS1[\u@\h \W]\$PS1为命令行提示符的信息,也就是[root@localhost myShell]#。\u为显示当前用户,以此类推,修改PS1即可修改命令行提示符的信息。
[root@localhost myShell]# echo $LANGen_US.UTF-8LANG为当前语系,这里是美国英文。
预定义变量
$0,$1,$2...: $0表示当前文件名。$1为第一个参数,$2为第二个,以此类推。
$*: 表示所有参数,当成一个参数对待。
$@: 表示所有参数,根据空格分开来对待。
$#: 表示参数的个数
$?: 表示最后命令运行的返回值,返回值为0为正常运行,否则出错。
$$: 表示当前进程的PID。
$!: 表示最近运行的后台进程的PID。
运算符
因为变量中默认为字符串类型,如果希望数据进行数值计算,直接加减乘除是不行的。
[root@localhost myShell]# opt1=1[root@localhost myShell]# opt2=2[root@localhost myShell]# opt3=$opt1+$opt2[root@localhost myShell]# echo $opt31+2可以看到,并不会直接相加,而是字符串的加减。
那么需要他们进行运算需要怎么样呢?
可以使用declare声明变量的类型
declare [+/-] [选项] 变量
我们可以有两种方式进行运算:
1.expr:
[root@localhost myShell]# opt3=$(expr $opt1 + $opt2)[root@localhost myShell]# echo $opt332.使用$(())或者$[]
[root@localhost myShell]# opt4=$(($opt1+$opt2))[root@localhost myShell]# echo $opt43
环境变量配置文件:
系统自定义的环境变量就在这些变量中保存和声明。
首先我们需要知道一个简单的命令。
当我们修改了环境变量配置文件之后,配置文件并不是马上就生效的,因为配置文件的加载是在用户登录的时候。
如果我们需要在修改了之后让其马上生效,需要重新登陆才可以。但这么做非常麻烦。
source 配置文件使用这个命令即可让配置文件马上生效。
常用的配置文件:
/etc/profile/etc/profile.d/~/.bash_profile~/.bashrc/etc/bashrc在登陆的时候,会加载这些配置文件,声明定义环境变量。
那么他们的执行顺序是怎么样的呢?
1.登录shell配置文件执行顺序/etc/profile -> /etc/profile.d/*.sh -> /etc/profile.d/lang.sh -> /etc/locale.conf -> ~/.bash_profile -> ~/.bashrc -> /etc/.bashrc
2.非登录shell配置文件执行顺序-> /etc/.bashrc -> /etc/profile.d/*.sh -> /etc/profile.d/lang.sh -> /etc/locale.conf这里可能看起来有点乱,如果画成流程图会稍微好点,大家可以画一下。
也就是说,我们的环境变量在哪里声明都可以,只要在这个流程中某个部分声明定义好了就可以了,只要没被覆盖,就能生效。
其他环境变量配置文件:
注销时候会执行的配置文件:
~/.bash_logout历史命令配置文件:
~/.bash_history本地shell登陆之前提示信息:
/ect/issue远程shell登陆之前提示信息:
/etc/issue.net登陆之后提示信息:
/etc/motd
说了这么多,那么shell到底如何进行编程呢?
要进行编程,首先要了解shell的流程控制语句。
if语句
if []then ...elif []then ...else ...fi在这里,[]返回true或者false,也可以使用test得到值。
case语句
case 值 in匹配1) ... ;;匹配2) ... ;;...*) ... ;;esacfor语句
for 变量 in {列表i}do ...donewhile语句
while []do ...doneuntil语句
until []do ...done
可以对很多东西进行判断。
1.文件类型
-d 文件 文件是否存在,且文件是否为目录-e 文件 文件是否存在-f 文件 文件是否存在,且文件是否为普通文件2.文件权限
-r 文件 是否具有读权限-w 文件 是否具有写权限-x 文件 是否具有执行权限这个有点缺陷,因为判断权限不区分用户,只要有某个权限就会返回。
3.文件之间的比较
文件1 -nt 文件2 文件1是否比文件2新文件1 -ot 文件2 文件1是否比文件2旧文件1 -ef 文件2 文件1和文件2源是否一致,可以判断软硬链接4.整数比较
操作数1 -eq 操作数2 操作数1和操作数2是否相等操作数1 -nq 操作数2 操作数1和操作数2是否不等操作数1 -gt 操作数2 操作数1是否大于操作数2操作数1 -lt 操作数2 操作数1是否小于操作数2操作数1 -ge 操作数2 操作数1是否大于等于操作数2操作数1 -le 操作数2 操作数1是否小于等于操作数25.字符串比较
-z 字符串 字符串是否为空-n 字符串 字符串是否不为空字符串1 == 字符串2 是否相等字符串1 != 字符串2 是否不等6.多条件判断
判断1 -a 判断2 逻辑与判断1 -o 判断2 逻辑或! 判断1 取反
利用上面的知识我们就可以写一些简单的脚本了:
例如:
打印出当前使用Linux的用户。
用过截取环境变量中的USER变量的第二个参数,得到当前的用户。
当然也可以直接使用$USER访问就可以了。
#!/bin/bashname=$( env | grep USER | cut -d "=" -f 2 )if [ "$name" == "root" ]then echo you are rootelse echo you are not root,you are $name fi
- Linux——Shell编程
- Linux Shell编程(1)——shell编程简介
- Linux的shell编程——语法
- linux系统作业——shell编程
- Linux下Shell编程——通配
- Linux学习——shell编程
- Linux 实验 —— shell 编程
- Linux shell编程——查找
- linux shell编程——if
- Linux——shell编程笔记
- Linux Shell编程(3)——运行shell脚本
- Linux Shell编程(27)——子shell
- Linux Shell编程(1)—小试牛刀(1)
- Linux Shell编程(1)—小试牛刀(2)
- Linux Shell 脚本编程(1)—Shell脚本基础知识
- Linux下Shell编程——awk编程
- Linux下Shell编程——awk编程
- Linux Bash Shell学习(七):shell编程基础——运行Shell脚本、function
- CURL上传文件
- C语言之类型转换
- 【Java学习20170503】MySQL
- XlistView的多条目加载
- 当谈 SQL 优化时谈些什么?
- Linux——Shell编程
- 运维学习22
- java 如何判断一个数是否为2的整数次幂
- linux系统安装好之后常用软件
- Linux之rpm软件包管理(redhat)
- 称砝码
- c/c++基础(一)
- 【CodeForces 803A】Maximal Binary Matrix(模拟)
- Ubuntu把家目录(home)文件夹修改成英文