变量赋值的方式
1. 直接赋值:
这是最基本的赋值方式,直接将一个值赋给变量。
name="qupeng"
2. 计算后赋值:
先进行一些计算或操作,然后将结果赋给变量。
result=$((2 + 3))
3. 从输入获取赋值:
从用户输入或其他数据源获取值并赋给变量。
echo "请输入你的名字:"
read name
4. 从其他变量赋值或引用赋值:
将一个已有变量的值赋给另一个变量。
var1="hello"
var2="$var1"
二、$@
和$*
的区别
1. $*
:
- 当在脚本中使用时,它会将所有的命令行参数当作一个整体来处理,参数之间以第一个字符(通常是空格)作为分隔符连接成一个字符串。
- 例如,如果在命令行运行脚本
test.sh arg1 arg2 arg3
,在脚本内部使用echo $*
,可能会输出类似arg1 arg2 arg3
的结果(具体格式取决于参数内容和分隔情况)。
2. $@
:
- 它也会获取所有的命令行参数,但与
$*
不同的是,它会将每个参数都当作独立的个体来处理。 - 继续上面的例子,在脚本内部使用
echo $@
,会输出arg1 arg2 arg3
,并且每个参数之间可以通过循环等方式单独操作,比如在一个for
循环中:
for arg in $@; do
echo $arg
done
会分别输出 arg1
、arg2
、arg3
,而如果用 $*
在类似的循环中,可能会因为被当作一个整体字符串而出现不同的处理结果(具体取决于循环和后续操作逻辑)。
三、算数运算命令
1. $(())
:
- 主要用于 Shell 脚本中的整数算术运算。它支持常见的算术运算符如
+
(加)、-
(减)、*
(乘)、/
(除)、%
(取余)等。 - 示例:
a=5
b=3
result=$((a + b))
echo $result # 输出 8
2. $[]
:
- 也用于 Shell 脚本中的算术运算,功能与
$(())
类似,但在一些较新的 Shell 版本中,$(())
的使用更为常见和推荐。 - 示例:
x=10
y=2
answer=$[x / y]
echo $answer # 输出 5
3. let
命令:
- 用于在 Shell 脚本中执行算术运算,可以直接对变量进行计算并更新变量的值。
- 示例:
num1=3
num2=4
let sum=num1 + num2
echo $sum # 输出 7
4. declare -i
:
- 先声明一个变量为整数类型,然后可以对其进行算术运算。
- 示例:
declare -i value
value=5
value=value + 3
echo $value # 输出 8
5. expr
命令:
- 是一个用于执行表达式求值的命令,可用于算术运算,但语法相对较为严格,表达式中的运算符和操作数之间需要有空格。
- 示例:
result=$(expr 2 + 3)
echo $result # 输出 5
6. bc
命令:
- 是一个功能强大的任意精度计算器语言,可以进行复杂的算术运算,包括小数运算等。它可以通过管道等方式与 Shell 脚本结合使用。
- 示例:
echo "2.5 + 3.5" | bc
# 输出 6.0
7. awk
:
- 主要是一个文本处理工具,但也可以用于算术运算。它通过指定字段和表达式来对文本中的数据进行处理,其中可以包含算术运算。
- 示例:
echo "1 2 3" | awk '{print $1 + $2}'
# 输出 3
vim 1.sh
read -p "请输入长方形的长" l
read -p "请输入长方形的宽" w
s1=$((l*w))
echo "面积为$s1" $(())
s2=$[ l*w ]
echo "面积为$s2" $[]
let s3=l*w
echo "面积为$s3" let
declare -i s4=$l * $w
echo "面积为$s4" declare
s5=' expr $l \* $w '
echo "面积为$5" expr
s6=' echo $l *$w | bc '
echo "面积为$6" bc
bash 1.sh
四、关于变量url
的操作
1. 截取网站访问的协议:
(1)echo $url | cut -d : -f 1
:
cut
命令用于按列或字段截取文本。这里-d :
指定分隔符为:
,-f 1
表示取第一个字段。对于url
变量的值https://blog.youkuaiyun.com/weixin_45029822/article/details/103568815
,它会截取到https
,即协议部分。
(2)echo $url | cut -c 5 == echo ${url:0:5}==expr substr $url 0 5
:
cut -c 5
是通过字符位置来截取,这里取第 5 个字符开始的内容。但实际上对于截取协议部分不太准确,因为协议部分长度不一定是从第 5 个字符开始固定长度的。echo ${url:0:5}
是 Shell 中的字符串切片操作,从索引 0 开始取 5 个字符,这里能正确截取到https
。expr substr $url 0 5
也是通过expr
命令来截取字符串从第 0 个字符开始的 5 个字符,同样可以截取到https
。
(3)echo ${url%:*}
:
- 这是 Shell 中的字符串删除操作,
%
表示从右边开始匹配并删除,:*
表示匹配第一个:
及其后面的所有内容,所以最终会保留左边的协议部分,即https
。
2. 截取网站访问账号信息:
(1)字符相关操作:
echo $url | cut -c 1-5
:从第 1 个字符开始截取到第 5 个字符,对于给定的url
,会截取到https
,但这可能不是真正想要的账号信息截取方式,只是按字符位置的简单截取。expr substr $url 55 9
:通过expr
命令从第 55 个字符开始截取 9 个字符,用于尝试截取账号相关信息,但这里的位置可能需要根据实际网站结构和账号信息所在位置准确调整。echo ${url:54:9}
和echo ${url:0-10:9}
:echo ${url:54:9}
是从索引 54 开始取 9 个字符的字符串切片操作;echo ${url:0-10:9}
是从倒数第 10 个字符开始取 9 个字符的操作,同样是为了尝试截取账号相关信息,但具体截取是否准确取决于账号信息在url
中的实际位置。
(2)分隔符相关操作:
echo $url | cut -d : -f 1
:这里再次出现,之前用于截取协议部分,按分隔符:
取第一个字段,对于账号信息截取来说不太合适,因为账号信息一般不在第一个字段(按:
分隔)。echo ${url%:*}
:之前用于截取协议部分,这里按这种删除操作对于账号信息截取通常也不符合需求,因为它是从右边匹配并删除特定内容。echo ${url##*/}
:这是从左边开始匹配并删除/*
及其前面的所有内容,用于获取最后一个/
后面的内容,比如对于给定的url
,会获取到103568815
,但这不一定是账号信息,可能是文章编号等其他信息,具体取决于网站的结构和url
的构成。
(3)命令相关操作:
basename
:用于显示路径中的基名,对于url
来说,如果把它看作一个路径形式,basename
会获取到最后一部分内容,比如对于https://blog.youkuaiyun.com/weixin_45029822/article/details/103568815
,它可能获取到103568815
,但这不一定是账号信息。dirname
:用于获取路径的目录部分,对于url
当作路径处理时,它会获取到除了最后一部分之外的前面部分内容,比如https://blog.youkuaiyun.com/weixin_45029822/article/details
,但这也不是账号信息的直接截取方式。