shell脚本中的变量4

shell脚本变量



一、变量的定义

变量就是内存一片区域的地址
变量的意义
命令无法操作一直变化的值,用一串固定的字符来表示不固定的目标可以解决这个问题


二、shell脚本中变量的定义方法

2.1环境级别:在环境关闭后变量失效

在当前sh有这个变量a,当运行脚本后,运行新的sh执行脚本,新sh没有变量a

[root@docker3 mnt]# a=1
[root@docker3 mnt]# cat test.sh 
#!/bin/sh
echo $a
[root@docker3 mnt]# sh test.sh 
[root@docker3 mnt]# echo $a
1
[root@docker3 mnt]# . test.sh 
1

在所有的子进程都能识别变量a

[root@docker3 mnt]# export a=1
[root@docker3 mnt]# sh test.sh 
1

重新退出再进去,系统的资源便被回收了,重新开启一个进程,所以变量a没有了

[root@docker3 mnt]# logout
[root@docker3 ~]# cd /mnt/
[root@docker3 mnt]# sh test.sh 
[root@docker3 mnt]# echo $a

系统永久设定都是在硬盘能找到文件的,没有的都是临时的


2.2用户级别

[root@docker3 mnt]# vim ~/.bash_profile

在这里插入图片描述

[root@docker3 mnt]# source ~/.bash_profile 
[root@docker3 mnt]# sh test.sh 
1
[root@docker3 mnt]# exit
[kiosk@foundation38 Desktop]$ ssh root@172.25.254.3
[root@docker3 ~]# sh /mnt/test.sh 
1
[root@docker3 ~]# su - yan
[yan@docker3 ~]$ sh /mnt/test.sh 

2.3系统级别

主配置文件,但是一般不要动(维护起来会很麻烦)

[yan@docker3 ~]$ vim /etc/profile

在子配置文件变更,效果一样的

[yan@docker3 ~]$ vim /etc/profile.d/a.sh
[root@docker3 ~]# cat /etc/profile.d/a.sh 
#!/bin/bash
export a=1
[root@docker3 ~]# su - yan
[yan@docker3 ~]$ sh /mnt/test.sh 
1

三、变量名称

字母数字下划线
不能用数字开头
建议:名称短全用大写字符,名称长用_区分字类
YAN
Yan_Linux
yaN_Linux

[root@docker3 ~]# a=1
[root@docker3 ~]# a1=1
[root@docker3 ~]# a-1=1
-bash: a-1=1: command not found
[root@docker3 ~]# a_=1
[root@docker3 ~]# a_1=1
[root@docker3 ~]# 1a=1
-bash: 1a=1: command not found
[root@docker3 ~]# _a=1

四、用户环境变量的更改

Liunx对java的编写

[root@docker3 mnt]# vim yan.java
[root@docker3 mnt]# cat yan.java 
public class yan{
public static void main(String args[]){
system.out.println("hello yan")
}
}

安装java

[root@docker3 mnt]# yum install java-11-openjdk.x86_64 java-11-openjdk-devel.x86_64 -y

java运行的所有命令都在这里,bin底下有Java运行的命令

[root@docker3 mnt]# cd /usr/lib/jvm
[root@docker3 jvm]# ls
java     java-11-openjdk                          java-openjdk  jre-11          jre-11-openjdk-11.0.ea.28-7.el7.x86_64
java-11  java-11-openjdk-11.0.ea.28-7.el7.x86_64  jre           jre-11-openjdk  jre-openjdk
[root@docker3 jvm]# cd jre-openjdk/
[root@docker3 jre-openjdk]# ls
bin  conf  include  legal  lib  release  tapset
[root@docker3 jre-openjdk]# cd bin/
[root@docker3 bin]# ls
jaotc      java     javap     jdb        jhsdb   jjs    jmod        jshell  jstatd   rmic         serialver
jar        javac    jcmd      jdeprscan  jimage  jlink  jps         jstack  keytool  rmid         unpack200
jarsigner  javadoc  jconsole  jdeps      jinfo   jmap   jrunscript  jstat   pack200  rmiregistry

ls是相对路径,因为在执行的时候,系统会检索路径

[root@docker3 bin]# ll /bin/ls
-rwxr-xr-x. 1 root root 117680 Jun 15  2018 /bin/ls
[root@docker3 bin]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@docker3 ~]# vim /etc/profile.d/java.sh
[root@docker3 ~]# cat /etc/profile.d/java.sh 
#!/bin/sh
export JAVA_HOME=/usr/lib/jvm/jre-openjdk
export PATH=$PATH:$JAVA_HOME:/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib
[root@docker3 ~]# source /etc/profile.d/java.sh 
[root@docker3 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/lib/jvm/jre-openjdk:/bin

test.sh变成系统命令了

[root@docker3 ~]# test.sh
-bash: test.sh: command not found
[root@docker3 mnt]# cat /etc/profile.d/java.sh 
#!/bin/sh
export JAVA_HOME=/usr/lib/jvm/jre-openjdk
export PATH=$PATH:$JAVA_HOME:/bin:/mnt
export CLASSPATH=.:$JAVA_HOME/jre/lib
[root@docker3 ~]# source /etc/profile.d/java.sh 
[root@docker3 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/lib/jvm/jre-openjdk:/bin:/mnt
[root@docker3 mnt]# test.sh
1
[root@docker3 ~]# test
test      testgdbm  test.sh   
[root@docker3 ~]# test.sh 
1

五、变量的转译

想显示¥5,显示的是变量5

[root@docker3 ~]# echo $5

\一次只能转译一个字符

[root@docker3 ~]# echo \$5
$5
[root@docker3 ~]# echo \$$5
$
[root@docker3 ~]# echo \$\$5
$$5

5.1批量转译(引用)

双引号,弱引用,只能引用一部分资源 :$ ! \ ` 不能引用
单引号,强引用,可以引用任何字符串

[root@docker3 ~]# echo "$$$"
3989$
[root@docker3 ~]# echo "!!!!!!"
echo "echo "$$$"echo "$$$"echo "$$$""
echo 3989echo 3989echo 3989
[root@docker3 ~]# echo "```"
>
[root@docker3 ~]# echo "\\\\\"
> 
[root@docker3 ~]# echo '$$$$$5'
$$$$$5
[root@docker3 ~]# echo '```5'
```5

5.2变量申明

因为ab视为一个变量,应该是a是变量,b不是

[root@docker3 ~]# a=1
[root@docker3 ~]# echo $ab
[root@docker3 ~]# echo ${a}b
1b

5.3变量的数组

[root@docker3 ~]# a=(1 2 3 4 5 6)
[root@docker3 ~]# echo $a
1
[root@docker3 ~]# echo ${a[0]}
1
[root@docker3 ~]# echo ${a[1]}
2
[root@docker3 ~]# echo ${a[-1]}
6
[root@docker3 ~]# echo ${a[@]}
1 2 3 4 5 6
[root@docker3 ~]# echo ${a[*]}
1 2 3 4 5 6

*表示的是一串字符 @表示的是6串字符

[root@docker3 ~]# "1 2 3 4 5 6"
[root@docker3 ~]# "1" "2" "3" "4" "5" "6"

表示元素的个数

[root@docker3 ~]# echo ${#a[@]}
6
[root@docker3 ~]# unset a[5]
[root@docker3 ~]# echo ${#a[@]}
5
[root@docker3 ~]# echo ${a[@]#}
1 2 3 4 5
[root@docker3 ~]# a[5]=6
[root@docker3 ~]# echo ${a[@]#}
1 2 3 4 5 6
[root@docker3 ~]# echo ${#a[@]}
6
[root@docker3 ~]# echo ${a[@]:0:3}
1 2 3
[root@docker3 ~]# unset a
[root@docker3 ~]# echo $a

六、Liunx中命令的别名设置

同样ls,有些有颜色,有些没有
在这里插入图片描述
查看参数知道ls添加了颜色参数,/bin/sh没有

[root@docker3 ~]# alias | grep ls
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'

临时设置

[root@docker3 ~]# alias xie="vim"
[root@docker3 ~]# xie yan
[root@docker3 ~]# exit
[kiosk@foundation38 Desktop]$ ssh root@172.25.254.3
[root@docker3 ~]# xie
-bash: xie: command not found

用户级别

[root@docker3 ~]# vim ~/.bashrc 

在这里插入图片描述系统所有用户级别

[root@docker3 ~]# vim /etc/bashrc 

在这里插入图片描述
不要xie了
删掉之前用户级和系统级的alias=‘vim’
还是有xie,因为source是增量级的环境

[root@docker3 ~]# source ~/.bashrc 
[root@docker3 ~]# source /etc/bashrc 
[root@docker3 ~]# xie 

要这样

[root@docker3 ~]# unalias xie
[root@docker3 ~]# xie
-bash: xie: command not found

七、利用命令执行结果设定变量的值

[root@docker3 ~]# TIME=date
[root@docker3 ~]# echo $TIME
date
[root@docker3 ~]# echo TIME=$(date)
TIME=Mon Feb 21 01:30:08 CST 2022
[root@docker3 ~]#  TIME=`date`
[root@docker3 ~]# echo $TIME
Mon Feb 21 01:30:53 CST 2022

脚本中的传参


7.1非交互式传参

[root@docker3 ~]# cat test.sh 
#!/bin/sh
echo '$0' is $0
echo '$1' is $1
echo '$2' is $2
echo '$3' is $3
echo '$*' is $*
echo '$@' is $@
echo '$#' is $#
[root@docker3 ~]# sh test.sh 
$0 is test.sh
$1 is
$2 is
$3 is
$* is
$@ is
$# is 0

@#表示脚本后面所跟字符串的个数

[root@docker3 ~]# sh test.sh yan
$0 is test.sh
$1 is yan
$2 is
$3 is
$* is yan
$@ is yan
$# is 1

¥*和¥@表示所有字符,星代表一串字符,@代表3串字符

[root@docker3 ~]# sh test.sh yan wei qiu
$0 is test.sh
$1 is yan
$2 is wei
$3 is qiu
$* is yan wei qiu
$@ is yan wei qiu
$# is 3

7.2交互式传参

[root@docker3 ~]# cat test.sh 
#!/bin/sh
read -p "please input world:" WORLD
echo $WORLD

八、脚本函数

输出红色字体

[root@docker3 ~]# cat test.sh 
#!/bin/sh
echo -e "\033[31mhello yan\033[0m"

但是需要多次输出有颜色的字体,每一次都写一次麻烦

[root@docker3 ~]# cat test.sh 
#!/bin/sh
ECHO()
{
echo -e "\033[$1m$2\033[0m"
}
ECHO 31 "hello yan"
ECHO 32 "hello wei"

在这里插入图片描述
运行一次就结束了,想要一直执行

[root@docker3 ~]# cat test.sh 
#!/bin/sh
read -p "please input world:" WORLD
echo $WORLD
[root@docker3 ~]# sh test.sh
please input world:yan
yan
[root@docker3 ~]# cat test.sh 
#!/bin/sh
ACTION()
{
  read -p "please input world:" WORLD
  [ "$WORLD" = "exit" ] && {
  exit
 }||{
  echo $WORLD
  ACTION
  }
}
ACTION
[root@docker3 ~]# sh test.sh
please input world:yan
yan
please input world:wei
wei
please input world:qiu
qiu
please input world:exit

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值