shell脚本变量
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 [email protected]
[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 [email protected]
[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
文章评论