常见的变量
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}
显示 012 三个字符
echo ${str:0:3}
echo ${str:0:7}
0 也算当中一位数
特殊变量
$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
=====================
对于特殊变量的使用,需要注意我们反而不能使用例如:${0}或者${$0}来获取当前脚本的文件名,因为0或者$0并不是我们定义的变量名,使用${}反而会识别不出来。所以对于特殊变量,我们正常使用就行。同时,平时我们写脚本的时候,相关的变量名也尽量不要和这些特殊变量重复,避免脚本执行错误。
对于$@而言,它会自动将所有的变量当做一个个元素单独去处理。
在 shell 中存在着一些特殊而又重要的变如:$1 $0 $#,我们称为特殊的位置变量要从命令行,函数,脚本,等传递参数时,就需要在shell脚本中使用位置参数变量
$0:显示当前的脚本文件名,如果在执行脚本时添加了路径,那么全部都会输出
$n:获取当前执行的 shell 脚本的第 n 个参数值比如:[n=1..9],如果 N 大于 9 那么就要使用{}来定义 比如${10}
$#:获取当前 shell 脚本后面接的参数的个数
$*:获取当前脚本的参数,不加引号和*" 则表示单个字符串。相当于"2 $3"
$@:同样也是获取当前 shell 的参数,不加引号和 $* 是一样的,那么加了引号如: "1" "$2"..
总结:$\*和$@不加双引号 是没有任何区别的,有双引号两者就有区别