一、shell中变量的类型
1.环境级变量
临时赋值:
echo $a ## 显示变量a的值
a=5 ##赋值效果只在当前shell中有效
export a=1 ##声明变量,这样使当前shell中变量在当前用户的所有子shell中都有效
当前shell关闭后,重新打开后赋值又无效。
关闭shell后,系统会回收资源,重新打开shell后,资源重置,所以赋值失效。
2.用户级变量
vim ~/.bash_profile:
#.bash_profile
#Get the aliases and fuctions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
#User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
export a=1
source ~/.bash_profile ##生效当前的更改信息
su -westos ##用户及环境变量只针对于被设定过的用户生效,切换用户后,变量会失效,因为切换用户后开启的shell读取的是自己在目录的.bash_profile
3.系统级环境变量配置主文件
vim /etc/profile ##系统级环境变量配置主文件,一般是不会对其进行修改。
系统级环境变量配置自定义子文件
vim /etc/profile.d/westos.sh:
[root@westosa westos]# cat /etc/profile.d/westos.sh
################################################
#Author: lee#
#Version: 1.0#
#Create_Time: 2021/08/14
#Mail: lee@westos.org
#Info:
#
#
################################################
#!/bin/bash
export a=1
source /etc/profile.d/westos.sh ##重新读取配置文件内容,让修改生效
这样设置的变量系统中的所有用户都可以使用该变量的
设置在执行命令时/mnt中的脚本可以调用的相对路径:
.bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/mnt
export PATH
export a=1
检测:
echo $PATH :
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/mnt
二、变量的命称
变量的名称只可以包含:字母、数字、符号
且不可以用数字开头。
示例:
[root@westosa mnt]# a@=1
bash: a@=1: command not found…
[root@westosa mnt]# 1a=1
bash: 1a=1: command not found…
\ ##转译单个字符
批量转译:
‘’ ##强引用,可以引用所有
“” ##弱引用,不可以引用\ $ ! 示例; [root@westosa mnt]# echo '$5' $5 [root@westosa mnt]# echo "$5"
##
三、变量的声明
[root@westosa mnt]# echo KaTeX parse error: Expected 'EOF', got '#' at position 5: ab #̲#当显示ab时,本想 a 的 值 显 示 出 来 , 但 系 统 识 别 a的值显示出来,但系统识别 a的值显示出来,但系统识别ab是一个变量的名称。
[root@westosa mnt]# echo ${a}b ##此时需要对a进行声明,{a}对a进行声明
6b
四、变量的数组
[root@westosa mnt]# a=(1 2 3 4 5) ##定义一个数组a
[root@westosa mnt]# echo ${a[0]} ##显示数组的第一个元素
1
[root@westosa mnt]# echo ${a[1]} ##显示数组的第二个元素
2
[root@westosa mnt]# echo ${a[]} ##显示数组的所有元素
1 2 3 4 5
[root@westosa mnt]# echo ${a[@]} ##显示数组的所有元素
1 2 3 4 5
${a[@]}= “1” “2” “3” “4” “5” ## @ 将元素单个列出
${a[]}=“1 2 3 4 5” ## * 将所有元素作为一个整体列出
[root@westosa mnt]# echo ${a[-1]} ##显示数组倒数第一个元素
5
[root@westosa mnt]# echo ${a[-2]} ##显示数组倒数第二个元素
4
[root@westosa mnt]# echo ${a[@]:0:3} ##显示数组从第一个元素开始向后的三个元素
1 2 3
[root@westosa mnt]# echo ${a[@]:2:3} ##显示数组从第三个元素开始向后的三个元素
3 4 5
[root@westosa mnt]# unset a[0] ##删除数组的第一个元素 :[root@westosa mnt]# echo ${a[@]} 2 3 4 5
unset a ##删除数组a
五、变量定义方式
1.命令的输出指定变量:
[root@westosa mnt]# vim ~/.bashrc
非交互式
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias xie='vim'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
2.脚本的传参:
vim test.sh:
echo '$0' is $0 ##脚本本身
echo '$1' is $1 ##脚本后边输入的第一个字符
echo '$2' is $2 ##脚本后边输入的第一个字符
echo '$3' is $3 ##脚本后边输入的第一个字符
echo '$*' is $* ##脚本后面跟得所有字符
echo '$@' is $@ ##脚本后面跟得所有字符
echo '$#' is $# ##脚本后面所输入的字符个数
3.交互式
vim westos.sh:
#!/bin/bash
read -p "Please input word:" -s WORD ##-s隐藏录入的值 ,-p 显示提示语句
echo $WORD
六、脚本中的函数
脚本中的函数可以理解为脚本中的脚本。
ECHO()
{
动作
}
脚本中的函数可以让脚本循环起来
ECHO()
{
动作
ECHO
}
ECHO
函数的脚本,实战演练
检查目标是否存在,并判断其类型:
#!/bin/bash
File_Type()
{
[ $1 "$FILENAME" ] && {
echo $FILENAME is "$2"
echo ""
Check_File
}
}
Check_File()
{
read -p " Please input filename: " FILENAME
[ "$FILENAME" = "exit" ] && {
echo bye
exit
}
File_Type " ! -e " "not found"
File_Type -L "link file"
File_Type -f "common file"
File_Type -d "directory"
File_Type -b "block file"
File_Type -S "socket"
File_Type -c "char file"
Check_File
}
Check_File
检测一个用户是否存在,存在的话,退出脚本。不存在先建立用户,设定用户密码,再退出。
#!/bin/bash
CREATE()
{
read -p "Please input username:" NAME
[ "$NAME" = "exit" ] && {
exit
}
id $NAME &> /dev/null && {
echo "$NAME is exits"
CREATE
} || {
read -p "Please input password:" -s PASSWD
useradd $NAME
echo $PASSWD | passwd --stdin $NAME
echo "$NAME is created"
CREATE
}
}
CREATE