############################1.变量###########################################
########简介:
(1)什么是变量?
变量即在程序运行过程中它的值是允许改变的量,变量是用一串固定的字符来标志不固定的值的一种方法,变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储scripts运行时可更改的程序信息。在shell 中变量是不可能永久保存在系统中的,必须在文件中声明。
(2)都有哪些变量?
在shell中变量分为环境级变量,用户级变量,系统级变量, 环境级变量只在当前shell中生效,shell关闭变量丢失, 用户级变量写在用户的骨文件中,只针对当前用户有效, 系统级变量被写在系统的配置文件/etc/profile中 ,变量即在程序运行时保存在内存中。 硬盘永久,内存临时的。
用户级的变量(相对于系统级文件后被加载) 在./profile中定义
系统级的变量 在/etc/profile中定义
环境级的变量 a=1 export a=1
变量名称的规范:
########各种级别下的变量
(1)环境级: export A=1
添加:export A=1
//查看不到变量的值是因为在不同的shell环境,新的shell会加载不同的配置文件覆盖原来的
(3)系统级: vim /etc/profile添加:export A=1
所有用户都可以共享变量资源。
实战演练
eg:实现用相对路径执行脚本(这是临时的,如果重启,设定会失效)
[root@desktop ~]# echo $PATH //查看环境变量
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@desktop ~]# ls /mnt/*
/mnt/file /mnt/install_apache.sh /mnt/passwd
[root@desktop ~]# chmod +x /mnt/*
[root@desktop ~]# install_apache.sh 11 //不能执行
bash: install_apache.sh: command not found...
[root@desktop ~]# PATH=$PATH:/mnt //修改路径
[root@desktop ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/mnt
[root@desktop ~]# install_apache.sh 12 //可以执行
the Listen is changed
[root@desktop ~]# exit //退出连接
logout
Connection to 172.25.254.169 closed.
[kiosk@foundation69 Desktop]$ ssh root@172.25.254.169 -X //重新连接
root@172.25.254.169's password:
Last login: Sun Jun 17 04:52:04 2018 from 172.25.254.69
[root@desktop ~]# chmod +x /mnt/*
[root@desktop ~]# install_apache.sh //不能执行
bash: install_apache.sh: command not found...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
########环境变量的设定方式
“”是弱引用,批量转译,不能转义”!”,”\”,”`”,”$”
\代表单个字符,相当于”
”是强引用,批量转译
$()变量声明,和“没有区别
$[]等同于(())
${}系统声明
echo 1+1 显示结果为1+1,其中1+1是可变长字符
echo $[1+1] 显示结果为2,是整形字符
###########变量值传递
$0 脚本的名字
$1 脚本后的第一串字符串
$2 脚本后的第二串字符串
$3 脚本后的第三串字符串
$# 脚本后所跟字符的个数
$* 脚本后跟的所有字符串,模式如“1 2 3 ……”
$@ 脚本后跟的所有字符串,模式如“1” “2” “3” ……
- 1
- 2
- 3
- 4
- 5
- 6
- 7
eg:vim file.sh
eg: $*和$@的区别(脚本示例):
[root@desktop ~]# vim for.sh
#!/bin/bash
for name in "$@"
do
echo "$name"
done
[root@desktop ~]# sh -x for.sh
- 1
- 2
- 3
- 4
- 5
- 6
- 7
[root@desktop ~]# vim for.sh
#!/bin/bash
for name in "$*"
do
echo "$name"
done
[root@desktop ~]# sh -x for.sh
- 1
- 2
- 3
- 4
- 5
- 6
- 7
##########read交互式传参
read -s NAME //-s 表示加密,输入的时候看不到输入的字符
read -p “input:” NAME //-p 打印
#!/bin/bash
read -p "please input a number:" -s IP(-p 后跟提示内容 -s 表示不显示输入的内容)
echo " "
ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down
eg:交互式设定用户文件和密码文件建立用户。
vim /mnt/create_user.sh
#!/bin/bash
read -p "please input userfile:" USERFILE
[ ! -e $USERFILE ]&&{
echo "\033[32mERROR:$USERFILE is not exist!!\033[0m"
exit 1
}
read -p "please input passfile:" PASSFILE
[ ! -e $PASSFILE ]&&{
echo "\033[32mERROR:$PASSFILE is not exist!!\033[0m"
exit 1
}
MAX_LINE=`awk 'BEGIN{N=0}{N++}{print N}' $USERFILE` //利用数据报告生成器计算userfile的行数;
for NUM in `seq 1 $MAX_Line` //变量NUM从1循环到最大值
do
USERNAME=`sed -n ${NUM}p $USERFILE` //利用sed对文件userfle进行逐行提取
PASSWORD=`sed -n ${NUM}p $PASSFILE`
useradd $USERNAME //建立用户
echo $PASSWORD | passwd --stdin $USERNAME //修改密码
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
###########命令别名的设定
alias xie='vim' shell 环境变量
vim .bashrc
alias xie='vim' 用户变量
source .bashrc
vim /etc/bashrc
alias xie='vim' 系统变量
source /etc/bashrc
删除文件中写的内容
unalias xie 撤销别名
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
1)临时设定:
alias xie=’vim’ //设定vim的别名,即输入xie即可打开vim的功能
如果exit断开连接,那么临时设定失效,下次登陆,xie命令不能识别;

2)永久生效:
(用户级)
vim ~/.bashrc
alias xie=’vim’
source ~/.bashrc //刷新
alias //查看,是否有设置的别名;
但是,这种是在root的家目录下设置的,只对root用户生效;如果切换至student用户,那么xie命令不能识别;


(系统级)
vim /etc/bashrc
alias xie='vim'
source /etc/bashrc
alias
- 1
- 2
- 3
- 4
这种方式,是在系统的配置文件修改的,对所有可以登陆系统的用户都生效;如,切换至student用户,xie命令也是生效的;
3)unalias xie; //撤销命令的别名:
因为虽然把文件信息删除之后,内存中还会存在别名设定的信息,所以刷新之后还会有alias xie存在;
#######利用命令执行结果设定变量
$? 是命令在执行完之后产生的退出值,范围为[0-255]
当$0=0,时表示命令执行没有错误输出,这个值可以用ecit 命令执行。
echo $? //查看退出值(0-255)
0 正确
1 命令执行的错误
2 方法不正确
示例 1:
利用echo $?返回退出值来判断是否ip 可以ping通;
[root@desktop mnt]# vim /mnt/ip_check.sh
#!/bin/bash
ping -c1 -w1 $1 &> /dev/dull
NUM=`echo $?`
[ "$NUM" == "0" ]&&{
echo " $1 is up! "
exit 1
}||{
echo " $1 is down!"
exit 1
}
[root@desktop mnt]# sh /mnt/ip_check.sh 172.25.254.74
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 112
- 3
- 4
- 5
- 6
- 7
- 8
######################2.函数##########################################
函数的优点:
1)循环执行;
2)简化脚本内容;
3)可读性更高;
示例 1:
要求:执行脚本回车,提示动作,输入add,建立用户,回车,输入密码;输入del,删除用户;如果输入exit;退出;
vim /mnt/create_user.sh
#!/bin/bash
ACTION_ADD()
{
[ "$1" == add ] && {
read -p "please input a username: " USERNAME
read -p "please input a password: " -s PASSWORD
useradd $USERNAME
echo -e "\033[31mthe users has created successfully!\033[0m"
echo $PASSWORD | passwd --stdin $USERNAME
}
}
ACTION_DEL()
{
[ "$1" == del ] && {
read -p "please input a username: " USERNAME
userdel -r $USERNAME
echo -e "\033[31m the user has deleted!\033[0m"
}
}
USER_CTL()
{
read -p "please input action(add or del): " ACTION
[ "$ACTION" == exit ] && {
echo -e "\033[31mbye\033[0m"
exit 0
}
ACTION_ADD $ACTION
ACTION_DEL $ACTION
USER_CTL
}
USER_CTL
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
示例 2:
实现对主机ip的网络ping检测循环不间断,直至输入exit才会退出;