文章目录
1.变量的定义
-
1)定义本身
变量就是内存一片区域的地址 -
2)变量存在的意义
命令无法操作一直变化的目标
用一串固定的字符来表示不固定的目标可以解决此问题
2.shell脚本中变量的定义方法
-
1)环境级别
export a=1
在环境关闭后变量失效 -
2)用户级别
vim ~/.bash_profile
export a=1 -
3)系统级别
vim /etc/profile
export a=2
vim /etc/profile.d/westos.sh
export b=3
%env显示所有的环境变量
1)环境级别
[root@node2 ~]# cat /mnt/westos.sh
echo $WESTOS
[root@node2 ~]# export WESTOS=1
[root@node2 ~]# sh /mnt/westos.sh
1
2)用户级别,切换用户就不能使用了
[root@node2 ~]# vim ~/.bash_profile
export WESTOS=1
[root@node2 ~]# exit
exit
[westos@node2 Desktop]$ sh /mnt/westos.sh
3)系统级别
[root@node2 mnt]# cd /etc/profile.d
[root@node2 profile.d]# vim westos.sh
export WESTOS=1
另开一个shell在普通用户下进行测试
[root@node2 profile.d]# sh /mnt/westos.sh
2
[root@node2 ~]# chmod +x /mnt/westos.sh
[root@node2 ~]# vim .bash_profile
添加:export PATH=$PATH:/mnt
[root@node2 ~]# source .bash_profile
[root@node2 ~]# echo $PATH
[root@node2 ~]# westos.sh
1
[root@node2 ~]# sh westos.sh #不用/mnt/就能用
- 4)变量名称
“字符” “_” “数字”
不能用数字开头
建议:
变量名称短全用大写字符
变量名称长用_区分子类
WESTOS
Westos_Linux
westoS_Linux
3.变量的转译
-
1)转译
\ #转译单个字符
“” #弱引用,批量转译个数字符 不能转译"" “`” “$” “!”
‘’ #强引用 -
2)声明
a=1
echo $ab
echo ${a}b -
3)变量的数组
a=(1 2 3 4 5)
echo ${a[0]} #取第一个元素
echo ${a[-1]}#取最后一个元素
echo ${a[*]} #数组中所有元素;*是表示“1 2 3 4 5”
echo ${a[@]} #数组中所有元素;@是表示“1” “2” “3” “4” “5”
echo ${a[@]:0:3} #从第1个元素开始王后取3个
echo ${#a[@]} #数组元素个数
1)
[root@node2 ~]# echo \$5 #\只能转移单个字符
$5
[root@node2 ~]# echo \$5\$6 #转移两个字符
$5$6
[root@node2 ~]# echo "!5" #“”批量转移字符,但不能%echo不能引用 "! ` \ $"四个
echo "nmcli connection reload "
nmcli connection reload
[root@node2 ~]# echo "444444"
444444
2)
[root@node2 ~]# A=1
[root@node2 ~]# echo $Ab
[root@node2 ~]# echo ${A}b #声明
1b
3)
[root@node2 ~]# A=(1 2 3 4 5 6)
[root@node2 ~]# echo ${A}#取第一个元素
1
[root@node2 ~]# echo ${A[0]}#取第一个元素
1
[root@node2 ~]# echo ${A[1]}#取第二个元素
2
[root@node2 ~]# echo ${A[-1]}#取最后一个元素
6
[root@node2 ~]# echo ${A[*]}#数组中所有元素
1 2 3 4 5 6
[root@node2 ~]# echo ${A[@]}#数组中所有元素
1 2 3 4 5 6
[root@node2 ~]# echo ${A[@]:0:3}#从第1个元素开始王后取3个
1 2 3
[root@node2 ~]# echo ${A[@]:2:2}#从第3个元素开始王后取2个
3 4
[root@node2 ~]# echo ${#A[@]}#数组元素个数
6
%例子
[root@node2 ~]# ifconfig enp1s0 | grep 'inet\>'
inet 172.25.254.203 netmask 255.255.255.0 broadcast 172.25.254.255
[root@node2 ~]# IP=(`ifconfig enp1s0 | grep 'inet\>'`) #IP即是一个数组,元素是inet一行元素
[root@node2 ~]# echo ${IP[1]} #显示第二个元素
172.25.254.203
4.Linux中命令的别名设定
-
1)alias xie=‘vim’ ##临时设定
-
2)vim ~/.bashrc
alias xie=‘vim’ ##只针对与用户生效 -
3)vim /etc/bashrc ##针对系统所以用户生效
alias xie=‘vim’ -
4)unalias xie ##删除当前环境中的alias
alias xie=‘vim’
5.用户环境变量的更改
环境变量:
用户在操作系统时使用到的命令搜索路径
设定方式:
~/.bash_profile
export PATH=$PATH:/mnt
/etc/bash_profile
export PATH=$PATH:/mnt
%环境级别
[root@node2 ~]# alias xie='vim'
[root@node2 ~]# xie
[root@node2 ~]# exit
exit
[westos@node2 Desktop]$ su
Password:
[root@node2 Desktop]# xie #环境级别,退出再登陆时就会失效
bash: xie: command not found...
%用户级别
[root@node2 Desktop]# cd
[root@node2 ~]# vim .bash_profile
[root@node2 ~]# vim .bashrc
alias xie='vim'
[root@node2 ~]# source .bashrc
[root@node2 ~]# xie
[root@node2 ~]# exit
exit
[westos@node2 Desktop]$ xie
bash: xie: command not found...
[westos@node2 Desktop]$ su
Password:
[root@node2 Desktop]# xie #用户级别,退出到其他用户不行,再次登陆本用户时还可以
%系统级别
[root@node2 ~]# vim /etc/bashrc
最后添加:alias xie='vim'
[westos@node2 Desktop]$ xie #系统级别。关掉重新打开shell,再普通用户下也能看到xie
[root@node2 ~]# unalias xie #删除变量xie
[root@node2 ~]# alias #查看变量
6.利用命令的执行结果设定变量
- 1)直接利用命令执行结果
$()|`` ##优先执行。
如:TEST=hostname
TEST=$(hostname)
- 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 ##脚本后所输入的字符串个数
交互模式传参:
read WESTOS ##对westos赋值
read -p “please input word:” ##输出提示语
-s ##隐藏输入内容
$()和``的区别:
1,
[root@node2 ~]# cd /mnt/
[root@node2 mnt]# ls
apache_port.sh clear_log.sh host_message.sh ip_show.sh passwd westos westos.sh
[root@node2 mnt]# vim test.pl
#!/usr/bin/perl
print "Content-type:text/hyml\n\n";
print `date`;
[root@node2 mnt]# perl test.pl
Content-type:text/hyml
Sat Dec 19 17:14:34 WITA 2020
[root@node2 mnt]# vim test.pl
#!/usr/bin/perl
print "Content-type:text/hyml\n\n";
print $(date);
[root@node2 mnt]# perl test.pl #$出错误了
Bareword found where operator expected at test.pl line 3, near "$(date"
(Missing operator before date?)
syntax error at test.pl line 3, near "date)"
Execution of test.pl aborted due to compilation errors.
2,
[root@node2 mnt]# vim westos.sh
#!/bin/env bash
echo '$0' $0
echo '$1' $1
echo '$2' $2
echo '$3' $3
echo '$#' $#
echo '$*' $*
echo '$@' $@
for i in "$*"
do
echo $i
done
~
[root@node2 mnt]# sh westos.sh westos linux javar
[root@node2 mnt]# sh -x westos.sh westos linux javar #"$*";查看for循环了一次
[root@node2 mnt]# vim westos.sh
for i in "$*"一行改为for i in "$@"
[root@node2 mnt]# sh -x westos.sh westos linux javar#"$@";查看for循环了三次
非交互模式传参
%交互模式传参:
[root@node2 mnt]# vim westos.sh
#!/bin/env bash
read -p "please input word: " -s WORD #-s不显示输入的word
echo "" #回车
echo $WORD
[root@node2 mnt]# sh westos.sh
please input word:
ecer
7.脚本函数
-
1)定义:
程序的别名 -
2)设定方式:
WORD()
{
action1
action2
}
WORD 在脚本中就代表action1 action2这两个动作
例子:
[root@node2 mnt]# vim color.sh
#!/bin/env bash
ECHO()
{
echo -e "\033[$1m$2\033[0m"
}
ECHO 31 "hello westos"
ECHO 32 "HELLO LINUX"
[root@node2 mnt]# sh color.sh
注意:$1时脚本后跟的第一串字符,$2时第二串字符。echo是函数,变量不能一样,用大写
练习
sh create_user.sh
Please input username:westos
westos exist---------> westos id exist—> Please input username:westos
westos not exist------Please input password:无回显密码
此用户自动建立并且密码为提示后设定的密码
并显示:westos is created
并再次提示Please input username:
当Please input username:exit 时退出
[root@node2 mnt]# vim create2_user.sh
#!/bin/bash
EXIT()
{
read -p "Please input username: " username
[ "$username" = "exit" ]||[ "$username" = "EXIT" ] &&{
echo "bye"
exit
}||{
USER_ACTION $username
}
}
USER_ACTION()
{
id $1 &> /dev/null && {
echo "$1 is exist"
EXIT
}|| {
read -p "Please input password: " -s password
echo ""
useradd $1
echo $password | passwd --stdin $1 &> /dev/null && echo $1 is created
EXIT
}
}
EXIT