SHELL脚本中的变量
变量的定义
-
变量本身
变量就是内存中一片区域的地址
-
变量存在的意义
命令无法操作一直变化的目标
用一串固定的字符来表示不固定的目标可以解决此问题.
SHELL脚本中变量的定义方法
- 环境级别
export A=1
在环境关闭后变量失效.
- 用户级别
vim ~/.bash_profile
export A=1
##编辑完配置文件后需要刷新配置
source ~/.bash_profile
- 系统级别
vim /etc/profile
export A=2
#或
vim /etc/profile.d/Test
export B=5
变量名称
-
变量名称可以包含的字符类型
- 字母
- 数字
- 下划线
- 但是不能使用数字开头
-
变量命名建议
- 变量名称短的时候全部使用大写字符
- 变量名称较长时用_区分子类
TEST ##名称较短 TEST_Ifconfig ##名称较长
变量的转译
转译
\ ##转译单个字符
"" ##弱引用,批量转译个数字符,但不能转译 \ '' $ !
'' ##强引用
示例输出
[root@Node1 ~]# echo #
[root@Node1 ~]# echo \#
#
[root@Node1 ~]# echo \####
####
##只转译了第一个#
[root@Node1 ~]# echo \# # # #
#
[root@Node1 ~]# echo \# \# \# \#
# # # #
[root@Node1 ~]# echo "# # # # #"
# # # # #
[root@Node1 ~]# echo "? ? ? ? ?"
? ? ? ? ?
[root@Node1 ~]# echo "$ $ $ $"
$ $ $ $
##体现了弱引用和强引用的区别
[root@Node1 ~]# echo "$1 $1 $1 $1"
[root@Node1 ~]# echo '$1 $1 $1 $1'
$1 $1 $1 $1
声明
A=1
echo $Ab ##会输出空值,因为系统将Ab当作了变量名
echo ${A}b ##输出1b,声明了A是变量
变量的数组
##定义一个5个元素的数组
A=(1 2 3 4 5)
##按照要求输出内容
echo ${A[0]} ##数组中的第1个元素
echo ${A[1]} ##数组中的第2个元素
echo ${A[2]} ##数组中的第3个元素
echo ${A[-1]} ##数组中的最后1个元素
echo ${A[*]} ##数组中的所有元素
echo ${A[@]} ##数组中的所有元素,与上一条含义相同
echo ${#A[@]} ##数组中元素的个数
##条件输出
${A[@]:起始元素ID:元素个数}
echo ${A[@]:0:2} ##从数组中第1个元素开始,输出2个元素
##即输出第1个和第2个元素
输出示例
[root@Node1 ~]# A=(1 2 3 4)
[root@Node1 ~]# echo ${A[0]}
1
[root@Node1 ~]# echo ${A[1]}
2
[root@Node1 ~]# echo ${A[-1]}
4
[root@Node1 ~]# echo ${A[*]}
1 2 3 4
[root@Node1 ~]# echo ${A[@]}
1 2 3 4
[root@Node1 ~]# echo ${#A[@]}
4
[root@Node1 ~]# echo ${A[@]:2:2}
3 4
Linux中命令的别名设定
alias Cai='vim' ##临时设定vim的别名为Cai
##退出环境后系统回收资源,临时设置失效
vim ~/.bashrc
alias Cai='vim' ##只针对当前用户起效
##不需要刷新配置
vim /etc/bashrc
alias Cai='vim' ##针对系统中所有的用户起效
##不需要刷新配置
##别名的删除
1. 删除bashrc中的设置内容
2.1 unalias Cai ##删除当前环境中的alias设置
2.2 当然直接exit退出终端环境也是可以的
用户环境变量的更改
环境变量
用户在操作系统时使用的命令搜索路径称为环境变量
##设定方式
##用户级别增加mnt目录为环境变量
~/.bash_profile
export PATH=$PATH:/mnt
##系统级别增加mnt目录为环境变量
/etc/bash_profile
export PATH=$PATH:/mnt
利用命令的执行结果设定变量
直接利用命令执行结果
TIME=$(date +%H:%M:%S)
echo $TIME
09:09:55
TIME=`date +%H:%M:%S`
echo $TIME
09:09:55
两者都可以使用,区别在于后者的使用更广,在perl
中也可以使用.
脚本中的传参
-
非交互模式
$0 ##脚本本身 $1 ##脚本后所输入的第1串字符 $2 ##脚本后所输入的第2串字符 $3 ##脚本后所输入的第3串字符 $* ##脚本后输入的全部字符,"Test1 Test2 Test3" $@ ##脚本后输入的全部字符,'Test1' 'Test2' 'Test3' $# ##脚本后输入的字符串的个数 ##举例 vim Test.sh ################################# # Author: NeuWings # Create_Time: 2021/03/09 ################################# #!/bin/bash echo '$0' IS $0 echo '$1' IS $1 echo '$2' IS $2 echo '$3' IS $3 echo '$#' IS $# echo '$*' IS $* echo '$@' IS $@ chmod +x /mnt/Test.sh [root@Node1 mnt]# /mnt/Test.sh Test Linux File $0 IS /mnt/Test.sh $1 IS Test $2 IS Linux $3 IS File $# IS 3 $* IS Test Linux File $@ IS Test Linux File
*
将所有字符当作一个字符串输出
@
将所有字符当作多个字符串输出
-
交互模式传参
################################# # Author: NeuWings # Create_Time: 2021/03/09 ################################# #!/bin/bash read -p "Please Input Word: " Test ##在当前环境运行此Shell脚本 source Test.sh Please Input Word: 12345 echo $Test 12345 ##可以看到,交互式赋值成功
脚本函数
TEST() {
action1
action2
}
则在脚本中出现的所有TEST
都表示actiosn1
和action2
两个动作.
每次引用TEST都将执行这两个动作.
同理,根据这个特性可以实现一般编程语言中的递归.
#################################
# Author: NeuWings
# Create_Time: 2021/03/09
#################################
#!/bin/bash
MAIN() {
read -p "Please Input Username: " USERNAME
[ "$USERNAME" = "EXIT" -o "$USERNAME" = "exit" ] && {
exit
} || {
USERCHECK $USERNAME
}
}
USERCHECK() {
id $1 &> /dev/null && {
echo "$1 is exist."
MAIN
} || {
CREATEUSER $1
}
}
CREATEUSER() {
useradd $1 &> /dev/null && {
read -p "Please Input Password: " -s PASSWORD
echo ""
echo $PASSWORD | passwd --stdin $1 &> /dev/null
echo $1 is created.
} || {
echo Unknown Error.
}
MAIN
}
MAIN
上面的脚本实现了循环创建新用户,当用户存在时提示用户存在,用户不存在时会自动建立并输入密码,输入exit
时退出脚本.