Shell编程 - 04永久环境变量 和特殊变量的使用细节 字符串回显位

206 阅读1分钟

常见的变量

echo $HOME 家目录 root 用户

/root

查看当前目录脚本所在路径 where is

环境变量 echo $PATH

查看输出结果 存在/usr/bin 目录,也就是当我们执行ls命令他会帮我们找到对应的目录去执行 ls 的完整路径为 usr/bin/ls

export PATH=/root:PATH

echo $PATH 查看环境变量 root 目录是否被添加 export: 是一个用于设置环境变量的关键字,使得设置的变量可以在当前 shell 以及由该 shel 启动的子进程中生效。 PATH:这是一企非常重要的环境变量,它定义了系统在哪些目录下去寻找可执行程序。当你在命令行输入命 (如 ls、cat 等)时, 系统会根据 PATH 环境变量所指定的目录顺序去查找对应的可执行文件,找到后就执行它 /root:PATH:这里是在重新定义 PATH 的值。它将/root 目录添加到了原有的 PATH 变量值的最前面 假设原有的 PATH 值存储在变量 PATH, 这里通过:PATH 的形式保留了原来的值并添加了新的部分。这样做的结果是,当系统去查找可执行程序时,会先在/root 目录下查找,然后再按照原来 PATH 所指定的其他目录顺序查找。

永久变量

刚刚的 export 只是设置了临时变量,那么我们只有把它写入到配置文件当中才能永久生效 vi .bashrc export PATH=/root:PATH source 变量生效 或者 重启生效 usr/bin/vi .bashrc source usr/bin/ .bashrc 1.sh

实现 解析 字符串长度

name="dashazi" name="dashazi" age="17" echo "my name is $name ,and I am $age years old" str="hello world" echo ${#str}

1732860503559.png

显示 012 三个字符

echo ${str:0:3} echo ${str:0:7}

0 也算当中一位数

1732860614539.png

特殊变量

$0 $# $n-->$[1..9] $\* $@

$0 当前脚本的文件名

$n (n>1) 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 1,第二个参数是 2。若 n 大于 10,则语法为${n}

$# 传递给脚本或函数的参数个数 $* 传递给脚本或者函数的所有参数

$@ 传递给脚本或函数的所有参数。当被双引号""包含时,$@和@*稍有不同

$? 上个命令的退出状态,或函数的返回值 $$ 当前Shell进程ID。对于Shell脚本,就是这些脚本所在进程ID

关于* 和@的区别

当他们被""包含时,区别就显示出来了:$* 把所有的参数看做一个整体,而$@把每个参数区分对待。具体的区别我们可以用一个案例来演示一下:

#!/bin/bash 
echo "=====================" 
echo "print all params by \"\$*\"" 
for var in "$*" 
do 
    echo $var 
done 
echo "=====================" 

echo "=====================" 
echo "print all params by \"\$@\"" 
for var in "$@" 
do 
    echo $var 
done 
echo "====================="

执行结果如下,我们可以发现,对于$@而言,它会自动将所有的变量当做一个个元素单独去处理。

[root@kali] sh ll.sh aa bb cc
=====================
print all params by "$*"
aa bb cc
=====================
=====================
print all params by "$@"
aa
bb
cc
=====================

1732860671700.png

对于特殊变量的使用,需要注意我们反而不能使用例如:${0}或者${$0}来获取当前脚本的文件名,因为0或者$0并不是我们定义的变量名,使用${}反而会识别不出来。所以对于特殊变量,我们正常使用就行。同时,平时我们写脚本的时候,相关的变量名也尽量不要和这些特殊变量重复,避免脚本执行错误。

对于$@而言,它会自动将所有的变量当做一个个元素单独去处理。

在 shell 中存在着一些特殊而又重要的变如:$1 $0 $#,我们称为特殊的位置变量要从命令行,函数,脚本,等传递参数时,就需要在shell脚本中使用位置参数变量

$0:显示当前的脚本文件名,如果在执行脚本时添加了路径,那么全部都会输出

$n:获取当前执行的 shell 脚本的第 n 个参数值比如:[n=1..9],如果 N 大于 9 那么就要使用{}来定义 比如${10}

$#:获取当前 shell 脚本后面接的参数的个数 $*:获取当前脚本的参数,不加引号和@是一样的加了引号;例如"@是一样的 加了引号;例如"*" 则表示单个字符串。相当于"11 2 $3"

$@:同样也是获取当前 shell 的参数,不加引号和 $* 是一样的,那么加了引号如: "@"表示将所有的参数视为不同独立的字符串,相当于"@" 表示将所有的参数视为不同独立的字符串,相当于"1" "$2"..

总结:$\*$@不加双引号 是没有任何区别的,有双引号两者就有区别