【精选】shell脚本

您所在的位置:网站首页 两个shell脚本传变量 【精选】shell脚本

【精选】shell脚本

#【精选】shell脚本| 来源: 网络整理| 查看: 265

变量的定义 变量如何定义变量的定义规则变量名区分大小写变量名不能有特殊符号变量名不能以数字开头等号两边不能有任何空格 变量的定义方式基本方式命令执行结果赋值给变量交互式定义变量(read)实例 定义有类型的变量(declare)实例 变量的分类本地变量环境变量全局变量系统变量实例

变量如何定义

变量是用来临时保存数据的,该数据是可以变化的数据

变量名=变量值

变量名:用来临时保存数据的

变量值:就是临时的可变化的数据

[root@maomao ~]# A=hello 定义变量A [root@maomao ~]# echo $A 调用变量A,在shell里一定要加"$" hello [root@maomao ~]# echo ${A} 还可以这样调用 hello [root@maomao ~]# A=world 因为是变量所以可以变 [root@maomao ~]# echo $A world [root@maomao ~]# unset A 取消变量 [root@maomao ~]# echo $A 不能再调用了 变量的定义规则

变量名也是有一定的要求,不能随便乱取

变量名区分大小写 [root@maomao ~]# A=hello [root@maomao ~]# a=world [root@maomao ~]# echo $A hello [root@maomao ~]# echo $a world 变量名不能有特殊符号 [root@maomao ~]# ?A=hello -bash: ?A=hello: command not found [root@maomao ~]# @A=hello -bash: @A=hello: command not found # 如果有空格的字符串赋值给变量 需要加"" [root@maomao ~]# A=hello world -bash: world: command not found [root@maomao ~]# A="hello world" 变量名不能以数字开头 [root@maomao ~]# 8A=hello -bash: 8A=hello: command not found [root@maomao ~]# A8=hello [root@maomao ~]# echo $A8 hello 注意:不能以数字开头,但以英文开头后面可以跟数字 等号两边不能有任何空格 # 敲习惯python之后 每次=两边都习惯敲空格 但shell里面变量的赋值是不能有空格的 >. [root@maomao ~]# A =123 -bash: A: command not found [root@maomao ~]# A= 123 -bash: 123: command not found [root@maomao ~]# A = 123 -bash: A: command not found [root@maomao ~]# A=123 [root@maomao ~]# echo $A 123 变量的定义方式 基本方式

直接赋值给一个变量

[root@maomao ~]# zhu=12345678 [root@maomao ~]# echo $zhu 12345678 [root@maomao ~]# echo ${zhu:2:4} 表示从A变量中第3个字符开始截取,截取4个字符 3456 # 类似python里面的切片 但python里面print(zhu[2:4])表示只截取下标2到3的字符 说明: $变量名 和 ${变量名}的异同 相同点:都可以调用变量 不同点:${变量名}可以只截取变量的一部分,而$变量名不可以 命令执行结果赋值给变量 [root@maomao ~]# zhu=`date +"%F %T"` [root@maomao ~]# echo $zhu 2021-03-27 01:39:06 [root@maomao ~]# mao=$(uname -r) [root@maomao ~]# echo $mao 3.10.0-1160.11.1.el7.x86_64 交互式定义变量(read)

read很重要,能够让用户自己给变量赋值 语法:

read [选项] 变量名

常见选项:

选项作用-p定义提示用户的信息-n定义字符数(限制变量值的长度)-s不显示(不显示用户输入的内容)-t定义超时时间,默认单位为秒(限制用户输入变量值的超时时间) 实例 # -n [root@maomao ~]# read -n 5 -p 'pls input a number:' num pls input a number:12345[root@maomao ~]# 6789 超过5个数字不让输了 # -s 不显示输入的值 [root@maomao ~]# read -s -p 'pls input a number:' num pls input a number: # -t [root@maomao ~]# read -t3 -p 'pls input a number:' num pls input a number:12345[root@maomao ~]# 12345 3秒内没输完程序直接结束 read一般在脚本里让用户输入想要的值赋给变量 和python input一样 read还可以读取文件里面的值赋给变量 [root@maomao ~]# cat ip.txt 192.168.188.188 255.255.255.0 [root@maomao ~]# read ip mask < ip.txt [root@maomao ~]# echo $ip 192.168.188.188 [root@maomao ~]# echo $mask 255.255.255.0 脚本里一般常用于while read 读取文件里面的每一行 定义有类型的变量(declare)

给变量做一些限制,固定变量的类型,比如:整型、只读

语法:

declare 选项 变量名=变量值

常用选项:

选项作用-i将变量看成整数-r定义只读变量-a定义普通数组;查看普通数组-A定义关联数组;查看关联数组-x将变量通过环境导出 实例 # -i 规定变量只能是整数 [root@maomao ~]# declare -i num=123 [root@maomao ~]# echo $num 123 [root@maomao ~]# num=aaa [root@maomao ~]# echo $num 0 [root@maomao ~]# a=10;b=20;c=a+b [root@maomao ~]# echo $c a+b [root@maomao ~]# declare -i a [root@maomao ~]# declare -i b [root@maomao ~]# declare -i c [root@maomao ~]# echo $c a+b [root@maomao ~]# c=a+b [root@maomao ~]# echo $c 30 # -r 规定变量成为只读变量 不能修改了 [root@maomao ~]# declare -r mao=helloworld [root@maomao ~]# echo $mao helloworld [root@maomao ~]# mao=python -bash: mao: readonly variable [root@maomao ~]# unset mao -bash: unset: mao: cannot unset: readonly variable # -a -A 是数组相关的 以后再写 变量的分类 本地变量

本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效

环境变量

环境变量:当前进程有效,并且能够被子进程调用。

env查看当前用户的环境变量set查询当前用户的所有变量(临时变量与环境变量)export 变量名=变量值 或者 变量名=变量值;export 变量名 或者 declare -x 变量名=变量值 # 临时设定一个环境变量 [root@maomao ~]# export zhu=helloworld [root@maomao ~]# env|grep ^zhu zhu=helloworld # 永久生效需要去 vim /etc/profile 或者 ~/.bashrc export zhu=helloworld 或者 zhu=helloworld export zhu 系统中有一个变量PATH,环境变量 export PATH=/usr/local/mysql/bin:$PATH 全局变量

全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用.

相关配置文件:

文件名说明备注~/.bashrc当前用户的bash信息,用户登录时读取局部。定义别名、umask、函数等~/.bash_profile当前用户的环境变量信息,用户登录时读取局部。~/.bash_logout当前用户退出当前shell时最后读取局部。定义用户退出时执行的程序等~/.bash_history当前用户的历史命令局部。history -w保存历史记录 history -c清空历史记录/etc/bashrc全局的bash信息全局。所有用户都生效/etc/profile全局环境变量信息全局。系统和所有用户都生效

以上文件修改后,都需要重新source让其生效

用户登录系统读取相关文件的顺序

/etc/profile

$HOME/.bash_profile

$HOME/.bashrc

/etc/bashrc

$HOME/.bash_logout

说明:本地变量、环境变量、全局变量是根据变量的作用域来区分的。

系统变量

系统变量(内置bash中变量) : shell本身已经固定好了它的名字和作用.

内置变量含义$?上一条命令执行后返回的状态;状态值为0表示执行正常,非0表示执行异常或错误$0当前执行的程序或脚本名$#脚本后面接的参数的个数$*脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开$@脚本后面所有参数,参数是独立的,也是全部输出$1~$9脚本后面的位置参数,$1表示第1个位置参数,依次类推 10   {10}~ 10 {n}扩展位置参数,第10个位置变量必须用{}大括号括起来(2位数字以上扩起来)$$当前所在进程的进程号,如echo $$$!后台运行的最后一个进程号 (当前终端)!$调用最后一条命令历史中的参数 实例 # $? 这是最常使用的系统变量 执行一段命令 然后echo $? 来查看返回值是否为0 从而判断命令是否执行成功 # 比如 判断防火墙是否关闭 pgrep firewalld &>/dev/null if [ $? -eq 0 ];then systemctl stop firewalld &>/dev/null fi # 判断软件是否安装 都可以使用$? rpm -q expect &>/dev/null if [ $? -ne 0 ];then [ $UID -eq 0 ] && yum install -y expect &>/dev/null || echo "你没有权限安装expect" fi # $0 如果要使用位置变量 需要告诉用户怎么使用 if [ $# -ne 3 ];then echo "usage:`basename $0` par1 par2 par3" exit fi # $* 和 $@都表示传递给函数或脚本的所有参数,不被双引号(” “)包含时,都以$1$2 … $n的形式输出所有参数。 # 但是当它们被双引号(” “)包含时,$* 会将所有的参数作为一个整体,以"$1$2 … $n"的形式输出所有参数;$@会将各个参数分开,以$1 $2 … $n单个的形式输出所有参数。 #!/bin/bash for i in "$@" do echo $i done echo "======我是分割线=======" for i in "$*" do echo $i done [root@maomao ~]# bash 3.sh a b c a b c ======我是分割线======= a b c

详细了解一下位置变量

[root@maomao shell]# vim test.sh #!/bin/bash echo "这是第二个位置变量:$2" echo "这是第一个位置变量:$1" echo "这是第四个位置变量:$4" echo "这是第五个位置变量:$5" echo "所有的参数是:$*" echo "参数的个数是:$#" echo "当前进程的PID是:$$" [root@maomao shell]# bash test.sh 1 2 3 4 5 这是第二个位置变量:2 这是第一个位置变量:1 这是第四个位置变量:4 这是第五个位置变量:5 所有的参数是:1 2 3 4 5 参数的个数是:5 当前进程的PID是:2026


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3