shell(4)shell脚本中的变量


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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qiao_qing/article/details/111567889