变量保存在内存;
变量记录在文件里,重启,让文件在内存中生效。
变量名称中通常包括大小写字母,数字,下划线(不是必须的)
变量名称格式:
WESTOS_LINUX
Westos_Linux
westoS_Linux
1)环境级变量:
运行脚本时,环境是独立的;
export 定义变量时,公共资源,运行脚本会看到内容;
当副级进程结束后,初始化进程root进程;
僵尸进程,一直占用资源,直至系统崩溃;
[root@desktop ~]# export westos=1 //声明
[root@desktop ~]# echo $westos
1
[root@desktop ~]# sh
sh-4.2# \echo $westos
1
sh-4.2#
2)用户级变量:
当在root用户下文件定义export a=1;
运行时可以看到内存中a的值;
重新加载了配置文件,覆盖了原始文件;
vim ~/.bash_profile
source .bash_profile
3)系统级变量:
vim /etc/ profile
source /etc/profile //手动刷新
示例:
实现用相对路径执行脚本(这是临时的,如果重启,设定会失效)
chmod +x /mnt/*
PATH=$PATH:/mnt
echo $PATH
例如用户变量文件~/.bashrc中设定export a=1,系统变量文件/etc/profile中设定export a=3,如果重启主机,会发现执行echo $a命令时,显示为1;这是因为系统文件先被加载,用户级的配置文件后读取;
环境变量的设定方式:
“”批量
\ 转义单个字符;
‘’= \ 强引用,‘’可以引用所有字符,表示对字符进行转义;
“” 弱引用,批量转义“”中出现的字符,但是不能转义 “!” “\” “`” ” $ ”
\${} 变量声明
\$()所有版本通用,标准扩展接口
示例:
$[ ]=( ( ) ) 运算
变量值传递
$# 脚本后所根字符串的个数;
$* 默认后面的字符是一串;
$@ 默认后面的字符是三串(独立的);
$1 脚本后的第一串字符串;
$2 脚本后的第二串字符串;
$3 脚本后的第三串字符串;
1)$*和$@的区别(脚本示例):
[root@desktop ~]# vim for.sh
#!/bin/bash
for name in "$@"
do
echo "$name"
done
[root@desktop ~]# sh -x for.sh
[root@desktop ~]# vim for.sh
#!/bin/bash
for name in "$*"
do
echo "$name"
done
[root@desktop ~]# sh -x for.sh
所以说$@后面跟的若干个字符是若干个;$*后面跟的若干字符是1个
2)脚本示例二:
文件创建用户,并修改密码完善(添加判断条件)
vim /mnt/create_user.sh
#!/bin/bash
[ "$#" -ne "2" ]&&{
echo "ERROR: please input userfile and passwordfile"
exit 1
}
MAX_LINE=`awk 'BEGIN{N=0}{N++}{print N}' $1` //利用数据报告生成器计算userfile的行数;
for NUM in `seq 1 $MAX_Line` //变量NUM从1循环到最大值
do
USERNAME=`sed -n ${NUM}p $1` //利用sed对文件userfle进行逐行提取
PASSWORD=`sed -n ${NUM}p $2`
useradd $USERNAME //建立用户
echo $PASSWORD | passwd --stdin $USERNAME //修改密码
done
交互式变量传参
用read实现变量传递
-p 打印提示语
-s 加密
(1)
vim test4.sh
#!/bin/bash
read -p "please input a number: " -s westos //打印提示语 -s 加密
echo " " //换行
echo $westos
sh test4.sh
(2)
vim test4.sh
#!/bin/bash
read -p "please input a number : " IP
ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down
(3)
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
说明:
echo “\033[32mERROR:$USERFILE is not exist!!\033[0m”
这里是添加颜色的输出为了让效果可以明显;
格式是 ” \033[32m 内容 \033[0m “ ,详情请百度”如何给命令添加颜色“;
linux中系统别别名的设定
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
这种方式,是在系统的配置文件修改的,对所有可以登陆系统的用户都生效;如,切换至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)可读性更高;
示例 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
示例 2:
实现对主机ip的网络ping检测循环不间断,直至输入exit才会退出;