【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
posted @ 2022-06-12 15:31  .Neterr  阅读(145)  评论(0)    收藏  举报