linux中的环境变量,别名,变量传递和函数块

一,概述

变量的定义

变量即在程序运行过程中它的值是允许改变的量
变量是用一串固定的字符来标示不固定的值的一种方法
变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储 Script 运行时可更改的程序信息
在 shell 中变量是不能永久保存在系统中的,必须在文件中声明在 shell 脚本中变量的种类

变量的分类

在 shell 中变量分为环境级变量,用户级变量,系统级变量
环境级变量只在当前shell中生效,shell关闭变量丢失
用户级变量写在用户的骨文件中(~/bash_profile),只针对当前用户生效
系统级变量被写在系统的配置文件/etc/profile 或者 /etc/profile.d/ 中,对于所有用户都生效

二,shell 脚本中变量的定义方法

1,环境级
export A=1

在系统的用户在终端自定义的变量是不能直接拿到脚本里面使用的,因为运行脚本时相当于在终端里面又打开了一个shell,这俩环境不一样,需要把原来的变量提升到环境变量级别,才可以使用。

[root@100 mnt]# vim file.sh
[root@100 mnt]# cat file.sh 
#!/bin/bash
echo $a
[root@100 mnt]# a=1
[root@100 mnt]# echo $a
1
[root@100 mnt]# sh file.sh        值为空

[root@100 mnt]# export a=1        提升至环境变量
[root@100 mnt]# sh file.sh 
1

可以看到脚本是2343这个进程的子进程,事实上直接输入sh就会打开一个shell

而且这种在命令行提升的方法在其他终端无法使用,因为环境不一样了,export只对当前环境有效

2,用户级

vim ~/bash_profile
export a=1

source 命令是重新加载,并且这种写在文加里面的方法不受用户终端环境的影响,但是只对该用户有效


3,系统级别

vim /etc/profile
export A=1


注意:修改之后一定要source重新加载文件

env可以查看系统的全部变量


三,

1,修改命令提示符

\u表示当前用户 \h表示主机名 \W表示相对路径 \w表示绝对路径

2,脚本运行与PATH变量

###虽然有可执行权限,但是不能直接运行

####PATH赋值

####执行成功,但是这种赋值是一次性的,当环境改变时就失效了

永久有效需要在/etc/profile写入export PATH=$PATH:脚本的绝对路径  同时source重新加载文件

四,变量名称的规范

变量名称中通常包含大小写字字母,数字,下划线(不是必须)
变量名称格式
WESTOS_LINUX
Westos_Linux
westoS_Linux

####注意变量的命名规则

####\是对空格的转义

###单引号就是\的批量,\是单个转义,''是批量转义

###双引号不可以引号! $ \ ``!

###单引号可以随便引,所见即所得,动词变名词


注意:当变量和常量在一起是,可以用{ }将变量引起来


五,数组

##目前的版本中$()完全等于``,都是先执行里面的然后赋值给变量

这里将ls的执行结果赋给haha,echo $haha其实就是打印数组的第0个值

六,变量值的传递

$0 是脚本本身的名字

$1 脚本后的第一串字符串
$2 脚本后的第二串字符串
$3 脚本后的第三串字符串
$# 脚本后所跟字符串的个数
$* 脚本后跟的所有字符串,模式为“ 1 2 3 ”
&@ 脚本后跟的所有字符串,模式为“ 1”“2”“3

$$ 是当前终端的PID

###注意这个$*实际上是一串字符

shell编程练习

给定userfile和passwdfile建立用户,要求脚本后面跟这俩文件名,输入不够时报错

测试

成功!!!

注意:for循环中的NUM变量通常也用NUM=`awk 'BEGIN{n=0}{N++}END{print N}' $1`,这样只需要一条命令

用 read 实现变量传递
read  WESTOS  没有任何提示,直接输入
read -p "input: "  -s  WESTOS   -s表示加密,不显示输入内容

read -p "input: "   WESTOS   -p表示打印提示


[root@100 mnt]# sh test1.sh 
123
$WESTOS is 123

[root@100 mnt]# sh test1.sh 
Please input a number: 123
$WESTOS is 123

[root@100 mnt]# sh test1.sh 
Please input a number: $WESTOS is 123            注意这里-s加密了,不显示,echo的内容直接显示了,可以写上echo " "

编程练习

1,判断某ip是否连通,交互式

[root@100 mnt]# vim ip_check.sh
[root@100 mnt]# cat ip_check.sh
#!/bin/bash
read -p "Please input a number: " IP       通过read实现参数的传递
ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down
[root@100 mnt]# sh ip_check.sh 
Please input a number: 172.25.254.2
172.25.254.2 is down
[root@100 mnt]# sh ip_check.sh 
Please input a number: 172.25.254.156
172.25.254.156 is up
2,通过userfile和passwdfile建立用户,判断文件是否存在,交互式

###echo 加颜色时要带上-e参数

测试:

成功!!!

七,linux 系统中命令别名的设定

alias可以查看系统存在的别名

alias write='vim' 设定系统别名,输入write时就会打开vim编辑器

这样的只是一次性的,永久有效需要写在~/.bashrc下面(只针对该用户有效)或/etc/bashrc下面(对所有用户有效),需要source重新加载

##取消alias别名,注释掉文件里面的信息 source重新加载 unalias 别名


八,利用命令执行结果设定变量

Hostname=$(hostname)
Hostname=`hostname`
$?
$? 是命令在执行完成之后产生的退出值
范围是 [0-255]
当 $?=0 时标示命令执行没有错误输出
这个值可以用 exit 命令执行 .
例如 exit 66

[root@100 mnt]# ls
file.sh      multiuser  passwd      test1.sh     userfile
ip_check.sh  nfsshare   passwdfile  user_add.sh
[root@100 mnt]# echo $?        ls命令执行成功
0
[root@100 mnt]# hahahha        不存在hahahha这条命令,所以失败
bash: hahahha: command not found...
[root@100 mnt]# echo $?
127

0表示成功(Zero - Success)

非0表示失败(Non-Zero  - Failure)

2表示用法不当(Incorrect Usage)

127表示命令没有找到(Command Not Found)

126表示不是可执行的(Not an executable)

>=128 信号产生

shell编程练习

用返回值的方法判断某ip是否连通


测试

[root@100 mnt]# sh ip_check.sh 
Please input a number: 172.25.254.11
172.25.254.11 is up
[root@100 mnt]# sh ip_check.sh 
Please input a number: 172.25.254.156
172.25.254.156 is up

成功!!!

九,脚本中的函数

脚本中的函数时把一个复杂的语句块定义成一个字符串的方法
Host_Message()
{

    xxxxxxxxxxxx

    xxxxxxxxxxxx

Host_Message   在函数块里面调用函数
}
Host_Message


shell编程练习

1,利用函数块的方式写脚本,判断ip是否连通,直到输入exit退出


测试

[root@100 mnt]# sh ip_check.sh 
Please input a number: 172.25.254.11
172.25.254.11 is down
Please input a number: 172.25.254.156
172.25.254.156 is up
Please input a number: exit
bye

成功!!!

2,文件类型判断

注意函数的参数和脚本的参数是不一样的

#!/bin/bash
FILE_CHECK()
{
        [ "$1" "$2" ] && {        ####注意这里的$1对应参数-d或-f ,$2对应参数$1(从外部获取),$3对应directory或file
                echo $2 is $3
                exit 0
        }
}
[ -e "$1" ] || {
        echo $1 is not exist!!!
        exit 0
}
FILE_CHECK -d $1 directory   ####这里调用了FILE_CHECK函数,有三个参数-d和$1,directory,$1从外部获取内容,这三个参数分别对应函数里面的变量$1,$2和$3
FILE_CHECK -f $1 file

测试

[root@100 mnt]# sh  -x file.check.sh /etc
+ '[' -e /etc ']'
+ FILE_CHECK -d /etc directory
+ '[' -d /etc ']'
+ echo /etc is directory
/etc is directory
+ exit 0
[root@100 mnt]# sh file.check.sh /etc/passwd
/etc/passwd is file
成功!!!

3,利用函数块实现创建,删除,退出的操作


注意:在ACTIONS函数块里面,可以不用做"$ACTION" = "add" 的判断,可以作为参数 ADD $ACTION;DEL $ACTION,然后在函数块ADD和DEL里面做判断

测试

[root@100 mnt]# sh action.sh
Please input a action:  add
Please input a username :haha
Please input a passwd :haha123
Changing password for user haha.
passwd: all authentication tokens updated successfully.
Please input a action:  del
Please input a username haha
Please input a action:  exit
bye
成功!!!


猜你喜欢

转载自blog.csdn.net/ha_weii/article/details/80764362