【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:(接收键盘输入)
选项:
-p:提示信息
-t:秒数
-n:字符数
-s:隐藏输入的数据
案例:
read -p "input param1:" param1 --param1是变量名
预定义变量
$? --上一条命令执行返回状态,0表示执行成功,非0表示失败
$$ --当前进程的进程号
$! --后台运行的最后一个进程的进程号
环境变量
定义环境变量不仅对当前Shell会话有效,还会传递给所有子进程(如脚本、命令或新启动的程序),成为进程间通信的一种方式
# 定义环境变量
export var1
shell变量
$HOME:家目录
$PWD:当前目录
$SHELL:当前使用的shell
参数变量
$n
--$0代表命令本身、$1-$9代表1到9变量
$#
--参数个数
$*
--所有参数,如果加了双引号所有参数看作一个整体,如果不加双引号,作用和$@
相同
$@
--所有参数,每个参数是单独的(可以for循环)
$@
案例:
#遍历参数
for arg in "$@"; do
echo "Processing: $arg"
done
#或
for arg in $*; do
echo "Processing: $arg" # 每个参数独立处理
done
当
$*
和$@
不被双引号包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数 据,彼此之间以空格来分隔。
但是当它们被双引号包含时,就会有区别了:
$*
会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。$@
仍然将每个参数都看作一份数据,彼此之间是独立的。
字符串变量
字符串可以用单引号、双引号、也可以不用引号
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个字符
提取子字符串(模式匹配和删除)
${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
path="/usr/local/bin/python"
echo ${path#*/} # *可以匹配一个单词,输出: usr/local/bin/python
最大左删除案例:
url="http://example.com/path/to/file.txt"
echo "${url##*/}" # 输出:file.txt
path="/usr/local/bin/python"
echo ${path##*/} # 输出: python
最小右删除案例:
#删除从右起第一个.及其右侧内容(最短匹配)。
filename="backup.tar.gz"
echo ${filename%.*} # 输出: backup.tar
最大右删除案例:
#删除从右起最后一个.及其右侧所有内容(最长匹配)
filename="backup.tar.gz"
echo ${filename%%.*} # 输出: backup
获取字符串长度
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
大小写转换(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
#定义空数组
arr3=()
#输出指定下标元素
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[@]}
# 数组间赋值(arr1赋值给arr2)
arr1=(a b c d)
arr2=( "${arr1[@]}" )
for i in "${arr2[@]}"
do
echo $i
done