【shell命令】变量
变量基础知识
定义变量不加$,使用变量加$
your_name="qinjx"
echo $your_name # 或${your_name}
数值运算:$((表达式))
案例:
cc=$((aa+bb))
declare
选项:
- --给变量设定类型属性
+ --取消变量类型属性
-i --将变量声明为整数类型
-x --将变量声明为环境变量
-p --显示指定变量被声明类型
# 使用 declare 声明一个整数变量
declare -i int_var=10
echo $int_var
# 使用 declare 声明一个只读变量
declare -r readonly_var="Hello, World!"
# 尝试修改 readonly_var 会导致错误
# readonly_var="This won't work"
# 声明一个数组
declare -a array_var=("element1" "element2" "element3")
echo ${array_var[1]}
变量命令
set --查看所有变量
env --查看环境变量
export --设置环境变量
readonly var1 -- 将变量设置为只读变量
unset var1 -- 删除变量
read:(接收键盘输入)
read:
选项:
-p:提示信息
-t:秒数
-n:字符数
-s:隐藏输入的数据
案例:
read -p "input param1:" param1 --param1是变量名
预定义变量
$? --上一条命令执行返回状态,0表示执行成功,非0表示失败
$$ --当前进程的进程号
$! --后台运行的最后一个进程的进程号
变量类型
- 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。 - 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。 - shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
环境变量
$PATH --系统查找命令的路径
环境变量配置文件:
/etc/profile --对所有用户生效
/etc/profile.d/*.sh --对所有用户生效
/etc/bashrc --对所有用户生效
~/.bash_profile
~/.bashrc
shell变量
$HOME:家目录
$PWD:当前目录
$SHELL:当前使用的shell
参数变量
$n --$0代表命令本身、$1-$9代表1到9变量
$# --参数个数
$* --所有参数,所有参数看作一个整体
$@ --所有参数,每个参数是单独的(可以for循环)
字符串变量
字符串可以用单引号、双引号、也可以不用引号
str1='aaa'
str2="bbb"
str3=ccc
单引号和双引号的区别
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现
双引号里可以有变量;双引号里可以出现转义字符
查找字符
string="runoob is a great site"
echo expr index "$string" o
# 输出 4
${} 用于参数扩展和变量操作
变量引用
name="World"
echo "Hello, ${name}!" # 输出:Hello, World!
提取子字符串
str1='aaabbb'
echo ${str1:1:3} #从第二个字符开始截取4个字符
获取字符串长度
str1='aaa'
echo ${#str1} # 输出3
字符串替换
${variable/pattern/replacement}:在变量 variable 中,将第一个匹配 pattern 的子串替换为 replacement。
${variable//pattern/replacement}:将 variable 中所有匹配 pattern 的子串替换为 replacement。
path="/home/user/dir"
echo "${path/dir/folder}" # 输出:/home/user/folder
echo "${path////}" # 删除所有斜杠,输出:homeuserfolder
默认值和空值检查
${variable:-default}:如果 variable 未设置或为空,则使用 default。
${variable:=default}:如果 variable 未设置或为空,则设置其值为 default。
name=""
echo "${name:-Anonymous}" # 输出:Anonymous
echo "$name" # 输出:(空)
name=${name:-Anonymous}
echo "$name" # 输出:Anonymous
模式匹配和删除
${variable#pattern}:从 variable 的开头删除最短匹配 pattern 的子串。
${variable##pattern}:从 variable 的开头删除最长匹配 pattern 的子串。
${variable%pattern}:从 variable 的末尾删除最短匹配 pattern 的子串。
${variable%%pattern}:从 variable 的末尾删除最长匹配 pattern 的子串。
url="http://example.com/path/to/file.txt"
echo "${url#http://}" # 输出:example.com/path/to/file.txt
echo "${url##*/}" # 输出:file.txt
大小写转换(Bash 4.0+):
${variable^^}:将 variable 中的所有小写字母转换为大写。
${variable,,}:将 variable 中的所有大写字母转换为小写。
name="hello world"
echo "${name^^}" # 输出:HELLO WORLD
echo "${name,,}" # 输出:hello world
数组:
${array[@]} 或 ${array[]}:引用数组的所有元素。
${#array[@]} 或 ${#array[]}:获取数组的长度。
${array[index]}:引用数组中索引为 index 的元素。
数组变量
#! /bin/bash
#定义数组1
arr1=(1 2 3 4)
or
arr1=(
1
2
3
4
)
#定义数组2
arr2[0]=1
arr2[1]=2
arr2[2]=3
#输出指定下标元素
echo ${arr1[0]}
echo ${arr2[1]}
#输出全部元素
for i in ${arr1[*]}
do
echo $i
done
#输出全部元素
for i in ${arr2[@]}
do
echo $i
done
#数组长度
echo ${#arr1[*]}
echo ${#arr2[@]}