1.变量的定义
定义本身:变量就是内存一片区域的地址
变量存在的意义:命令无法操作一直变化的目标;用一串固定的字符来表示不固定的目标可以解决此问题
2.shell脚本中变量的定义方法
1)环境级别
export a=1 在环境关闭后变量失效
实验:
a=1
echo $a 【会显示1】
exit 【退出当前连接的用户】
ssh -l root 172.25.254.117 #再次连接相当于重新开了shell,进程不一样了
echo $a
2)用户级别
vim ~/.bash_profile
export a=1`
实验:
vim ~/.bash_profile
export a=1
source ~/.bash_profile
echo $a 【会显示a=1】
su - westos #切换用户身份
echo $a 【什么都不显示】
3) 系统级别
vim /etc/profile #在主配置文件中编写
export a=2
vim /etc/profile.d/westos.sh #在子配置文件/etc/profile.d中新建立个脚本westos.sh,编写
export b=3
!以上两种方法都可以在主配置文件和子配置文件中编写的效果时一样的,但是主配置文件里命令较多,万一编写错了可能系统起不来,建议在子配置文件中编写
实验:
vim /etc/profile.d/westos.sh
#!/bin/bash
export a=1
source /etc/profile.d/westos.sh
echo $a 【会显示1】
su - westos #切换用户身份
echo $a 【切换用户身份后也会显示1】
3.变量名称
1)变量名称可包含的字符:字母、下划线_、数字
2)变量名称定义规则:不能用数字开头
3)建议:
变量名称短全用大写字符
变量名称长用_区分子类
WESTOS
Westos_Linux
westoS_Linux
4.变量的转译
1)转译
\ #转译单个字符
"" #弱引用,批量转译个数字符 不能转译"\ 反斜杠" "`反引号" "$" "!"
'' #强引用
2)声明
a=1
echo $ab
echo ${a}b
3)变量的数组
a=(1 2 3 4 5)
a$ [a[@]:起始元素id:元素个数]
数组中元素的个数是从0开始算起:例如a[0]表示数组中第一个元素、a[1]表示数组中第二个元素、a[4]表示数组中第五个元素、
echo ${a[0]} ##数组中第一个元素
echo ${a[-1]} ##数组中最后一个元素
echo ${a[*]} ##数组中所有元素
echo ${a[@]} ##数组中所有元素
echo ${a[@]:0:3} ##数组中第一个元素到第3个元素
echo ${#a[@]} ##数组中元素的个数
create_user.sh userfile
userfile用的用户会被全部建立
a[5]=6 ##添加第6个元素,数值为6(因为数组中元素的个数是从0开始算起的)
unset a[n] ##删除数组中的第n+1个元素【例如:unset a[4] #表示删除这个数组中第5个元素】
unset a ##删除a这个数组
5.Linux中命令的别名设定
1)临时设定
alias xie='vim' ##临时设定
xie #执行写就会出现vim编辑的页面
alias #查看命令中的别名
退出shell,重新建立shell
xie 不能执行此命令
2)用户级别设定
vim ~/.bashrc
alias xie='vim' ##只针对与用户生效
source ~/.bashrc #增量的刷新
xie #执行此命令就会出现vim编辑的页面
退出shell,重新建立shell,执行xie命令也会出现vim编辑画面
su - westos #切换用户身份
xie #不能执行此命令
exit
3)系统级别设定
vim /etc/bashrc ##针对系统所以用户生效
alias xie='vim'
source /etc/bashrc #增量的刷新
xie #执行此命令就会出现vim编辑的页面
su - westos #切换用户身份
xie #此命令仍然生效
unalias xie ##删除当前环境中的alias【删除~/.bashrc、/etc/bashrc里面添加的别名设定】
6.用户环境变量的更改
设定方式:
~/.bash_profile
export PATH=$PATH:/mnt
/etc/bash_profile
export PATH=$PATH:/mnt
实验:
vim /mnt/test.sh
echo a=1
echo $PATH
chmod +x /mnt/test.sh
/mnt/test.sh
vim ~/.bash_profile
export PATH=$PATH:/mnt
source ~/.bash_profile
echo $PATH
/mnt/test.sh #能自己执行
1)直接利用命令执行结果
$() 或者 `` ##优先执行
TEST=`hostname` TEST=$(hostname)
例如:
TIME=date
echo $TIME #出现的是date字符
TIME=$(date)
echo $TIME #出现的是时间
TIME=`date` #跟$(date)效果一样,但是``应用地方更多
2)脚本中的传参
非交互模式:
`$0 is /mnt/test.sh` <!--脚本本身-->
`$1 is westos <!--脚本后所输入的第一串字符-->
`$2 is linux` <!--脚本后所输入的第一串字符-->
`$3 is redhat` <!--脚本后所输入的第一串字符-->
`$* is westos linux redhat` <!--脚本后所输入的所有字符"westos linux redhat"-->
`$@ is westos linux redhat` <!--脚本后所输入的所有字符'westos' 'linux' 'redhat'-->
`$# is 3` <!--脚本后所输入的字符串个数-->
实验:
vim test.sh
#!/bin/bash
echo '$0' is $0
echo '$1' is $1
echo '$2' is $2
echo '$3' is $3
echo '$#' is $#
echo '$*' is $*
echo '$@' is $@
sh test.sh
$0 is test.sh
$1 is
$2 is
$3 is
$# is 0
$* is
$@ is
sh test.sh test
$0 is test.sh
$1 is test
$2 is
$3 is
$# is 1
$* is test
$@ is test
sh test.sh test linux
sh test.sh test linux westos
2)交互模式传参:
read WESTOS ##对westos赋值
read -p "please input word:" ##输出提示语
-s ##隐藏输入内容
实验:
vim test1.sh
#!/bin/bash
read -p "Please input word: " -s WORD ##输出提示语,并隐藏输入内容
echo " " #显示空格,相当于换行【相当于\n】
echo $WORD #显示刚才输入的变量
sh test1.sh
Please input word:
hello
7.脚本函数
定义:程序的别名
设定方式:
WORD()
{
action1
action2
}
WORD 在脚本中就代表action1 action2这两个动作
练习脚本
sh create_user.sh
Please input username: westos
westos exist----<output>---> westos is exist------>Please input username:
westos not exist---------please input password: 无回显密码
此用户会自动建立并且密码为提示后设定的密码
并显示:westos is created
并再次提示Please input username:
当Please input username:exit
此脚本退出
脚本书写思路
1)判定exit推出
[ "$USER" = "exit" -o "$USER" = "EXIT" ] &&{
echo bye
}||{
进入判定用户是否存在
}
2) 判定用户是否存在
用户存在显示返回判定exit
id 用户名称变量 &> /dev/null && {
echo 用户存在
判定exit
}
用户不存在建立用户返回判定exit
||{
显示 please input password:
建立用户
更改密码
显示用户建立成功
判定exit
}
vim create_user.sh
#!/bin/bash
ACTION()
{
read -p "Please input username: " username
[ "$username" = "exit" ] && {
echo bye
exit
}
grep "$username" /etc/passwd &>/dev/null && {
echo $username is exist
ACTION
} || {
echo $username is not exit
read -p "please input password: " -s passwd
useradd $username
echo $passwd | passwd --stdin $username
echo $username is created
ACTION
}
}
ACTION