shell 的参数链接
介绍
shell:是一个用C语言编写的程序,它是用户使用linux的桥梁 ;shell是系统的用户界面提供了用户与内核进行交互操作的一种接口
Shell:是一个命令行解释器,它为用户提供了一个面向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell:还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令
在公司中应用的环境:
shell 脚本 :70%以上是和任务计划结合完成任务( 分 时 日 月 周 命令或者是脚本进行查看或者执行) ;或者做一些复杂的、重复性任务,可以帮助管理员实现批量化完成任务,实现自动化运维。
命令的分类
内部命令: 集成于shell 解释器内部的一些特殊指令,不对应单独的系统文件,自动载入内存,用户可直接使用的命令
外部命令:在Linux 系统中能够完成特定功能的脚本文件或二进制程序,每个外部命令会对应一个系统文件 (要想使用必须知道外部命令对应文件的位置)
注意: Linux系统会将外部命令所在的位置添加到默认的“搜索路径”中;所以用户在执行命令时不需要知道完整路径,直接执行该命令即可
任何一门语言都有解释器:python、php、java、c、c++ 等等,在所有语言运行的时候,都会先转换成机器码,然后在去运行
[root@C7--01 ~]# cat /etc/shells #linux有6种解释器
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
shell解释器以:
#!/bin/bash 或者 #!/bin/sh 为开头
python解释器以:
#!/usr/bin/env python 为开头
shell脚本在执行命令的时候是从上往下依次执行,在运行期间如有其中一行执行错误,程序仍然会继续执行命令直到结束
测试
vim cs.sh #后缀.sh可加可不加,但是习惯性需要加上
#!/bin/bash
ls /root
echo "你好,世界"
zzzzzzz
sleep 3
echo "彩虹"
保存退出
[root@C7--01 ~]# bash cs.sh #测试结果相同
anaconda-ks.cfg cs.sh yum.sh
你好,世界
cs.sh:行6: zzzzzzz: 未找到命令
彩虹
执行脚本操作 | ||
方法一 | bash 脚本名称 | 不需要写解析器,并且不需要给脚本设置执行权限 |
bash -n 脚本名称 | -n 选项只做语法检查,而不执行脚本 | |
bash -vx 脚本名称 | 调试脚本,脚本输出 | |
方法二 | sh 脚本名称 | 不需要写解析器,并且不需要给脚本设置执行权限 |
方法三 | source 脚本名称 | 不需要写解析器,并且不需要给脚本设置执行权限 |
方法四 | ./ 脚本名称 (在当前工作目录下执行脚本) | 需要写解析器,需要给脚本设置执行权限 |
系统变量 |
|
$$ | 返回当前shell本身进程号的PID |
$! | shell最后运行的后台procwss的PID(在shell里面嵌套shell所返回的PID) |
$@ | 所有参数列表,用 "" 括起来是以单体输出 |
$* | 所有参数列表,用 "" 括起来是以整体输出 |
$- | 使用set命令设定的Flag一览 |
$# | 表示统计命令行中位置参数的个数 |
$0 | 表示当前执行的命令或脚本程序的名称 |
$? | 用于查看前一条命令执行后的返回状态 (返回0 说明前一条命令正确;返回非0 值,说明前一条出现异常) |
逻辑测试 | |
&& | 逻辑与,且的意思;要求所有的条件都得满足 (如果使用test 进行测试时,可以用 -a 代替)(前面的命令执行成功,才会执行后面的命令) |
|| | 逻辑或的意思;多个条件只要满足一个即可 (如果使用test 进行测试时,可以使用 -o 代替) |
! | 逻辑否的意思;表示“不”;当指定条件不成立时,测试命令返回值为 0 |
一、shell脚本变量
定义:是用来存放系统和用户需要使用的特定参数,这些特定参数会根据用户的设定或环境的变化而变化(可以变化的物理量)
变量的组成: 变量名 + 变量值; 定义变量的基本格式 “变量名=变量值”
变量名的命名规则:不能以数字和特殊符号开头
--------------系统变量
[root@C7--01 ~]# env #输入env会输出系统本地原有的变量
XDG_SESSION_ID=25
HOSTNAME=C7--01
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.1.254 52271 22
SSH_TTY=/dev/pts/1
USER=root
.........
............
环境变量
定义:是出于运行需要,由Linux系统提前创建的一类变量,主要用于设置用户的工作环境;包括用户的宿主目录、命令查找路径、用户当前目录,登录终端等
注意:环境变量的值是随着Linux系统自动维护,会随着用户状态改变而自动改变
环境变量 | 说明 |
---|---|
PATH | 指定命令的搜索路径,以冒号为分隔符 |
HOME | 指定用户的主工作目录 |
HISTSIZE | 命令历史文件 |
LOGNAME | 当前的登录名 |
HOSTNAME | 主机的名称 |
SHELL | shell的全路径名 |
TERM | 用户控制终端的类型 |
PWD | 当前工作目录的全称 |
PS1 | 命令基本提示符,root用户是“#”,对于普通用户是“"$" |
案例
[root@C7--01 ~]# pwd
/root
[root@C7--01 ~]# echo $PWD
/root
自定义变量
定义:由系统用户自己去定义,只在用户的自己shell 环境中有效,又称为本地变量
定义自定义变量的基本格式 "变量名=变量值” (注意:变量名以字母或下划线开头,不能包含特殊字符(+,-,/,%,#等);等于号两侧没有空格)
注意:默认情况下,用户所定义的变量只在当前登录shell 中生效,在其他的子shell或其他终端,新shell环境中不生效,这种称为局部变量
全局变量:让用户所定义的变量能够在所有的子shell 环境中使用,减少重复设置工作
案例
[root@C7--01 ~]# bj=hd
[root@C7--01 ~]# echo $bj
hd
位置变量
在位置变量中空格输入在多其位置还是第一位,位置变量最多为9,但是超过9就是10两位,就需要 花括号 {}
[root@C7--01 ~]# vim wzbl.sh
#!/bin/bash
echo '$1'的值是"$1"
echo '$2'的值是"$2"
echo '$3'的值是"$3"
echo '$4'的值是"$4"
echo '$5'的值是"$5"
echo '$6'的值是"$6"
echo '$7'的值是"$7"
echo '$8'的值是"$8"
echo '$9'的值是"$9"
echo '$10'的值是"$10"
[root@C7--01 ~]# bash wzbl.sh 执行脚本
$1的值是
$2的值是
$3的值是
$4的值是
$5的值是
$6的值是
$7的值是
$8的值是
$9的值是
$10的值是0
案例 1
[root@C7--01 ~]# bash wzbl.sh A #不管空格输入了多少始终是第一位
$1的值是A
$2的值是
$3的值是
$4的值是
$5的值是
$6的值是
$7的值是
$8的值是
$9的值是
$10的值是A0 # 在系统环境中在识别时会认为是$1,我们的认为是$10
[root@C7--01 ~]# vim wzbl.sh
#!/bin/bash
echo '$1'的值是"$1"
echo '$2'的值是"$2"
echo '$3'的值是"$3"
echo '$4'的值是"$4"
echo '$5'的值是"$5"
echo '$6'的值是"$6"
echo '$7'的值是"$7"
echo '$8'的值是"$8"
echo '$9'的值是"$9"
echo '$10'的值是"${10}" #修改
[root@C7--01 ~]# bash wzbl.sh A
$1的值是A
$2的值是
$3的值是
$4的值是
$5的值是
$6的值是
$7的值是
$8的值是
$9的值是
$10的值是 #无变量值
$@和$*的区别(注意是在for循环中,如有不同方法实现可留言) | |
$@ | 所有参数列表,用 "" 括起来是以单体输出 |
$* | 所有参数列表,用 "" 括起来是以整体输出 |
案例
[root@C7--01 ~]# vim wzbl.sh
#!/bin/bash
echo '$1'的值是"$1"
echo '$2'的值是"$2"
echo '$3'的值是"$3"
for i in "$*"
do
echo $i
done
for i in "$@"
do
echo $i
done
保存退出
验证位置变量:
[root@C7--01 ~]# bash wzbl.sh A B C
$1的值是A
$2的值是B
$3的值是C
A B C #$*是整体输出
A #$@是单体输出
B
C
$# | 表示统计命令行中位置参数的个数 |
$0 | 表示当前执行的命令或脚本程序的名称 |
$? | 用于查看前一条命令执行后的返回状态 (返回0 说明前一条命令正确;返回非0 值,说明前一条出现异常) |
$$ | 返回当前shell本身的PID |
[root@C7--01 ~]# vim wzbl.sh
#!/bin/bash
echo '$1'的值是"$1"
echo '$2'的值是"$2"
echo '$3'的值是"$3"
echo $#
echo $0
echo $?
echo $$
sleep 30 #进程保留30s
保存退出
验证:
[root@C7--01 ~]# bash wzbl.sh A B C
$1的值是A
$2的值是B
$3的值是C
3 # $# 统计命令行中位置参数的个数
wzbl.sh # $0 当前执行的命令或脚本程序的名称
0 # $? 查看返回状态(返回0上一条命令执行成功,返回非0说明异常)
14947 # $$ 当前shell本身的PID
重新打开一个端口查询
[root@C7--01 ~]# ps aux | grep 14947
root 14947 0.0 0.1 113132 1392 pts/1 S+ 09:42 0:00 bash wzbl.sh A B C
root 14996 0.0 0.0 112676 980 pts/2 R+ 09:42 0:00 grep --color=auto 14993
二、shell条件判断
基本相同: 七章——Shell脚本应用(二)(应用——linux高级管理)
目的:shell 环境会根据执行命令返回后状态值($?)来判断条件是否执行成功(返回值为0 表示成功;返回值为非0 值表示失败或异常)
进行条件判断的基本语法:
第一种: test 条件表达式
第二种: [ 操作符 对象 ] ("[" 和条件表达式之间最少要有一个空格)
判断文件和目录的操作符
判断选项 | |
-d | 测试目录存在 |
-e |