你该认识这样的Linux_shell之变量操作符与循环分支

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你该认识这样的Linux_shell之变量操作符与循环分支相关的知识,希望对你有一定的参考价值。

                            Linux shell之变量与操作符

声明与简介

Shell是系统的用户界面,它提供了用户跟内核进行交互的桥梁。Shell是一个命令解释器,它接收用户输入的命令并送到内核去执行。

本文主要介绍围绕Shell的变量、参数、操作符、分支循环来展开,主要介绍变量的定义、使用;参数的使用、常见的操作符、分支与循环的常见使用方法。

: 至少有一台linux环境,当前验证环境是Centos 8。

Linux 各Shell版本示例

定义变量

这里的变量区别于系统变量,是用户根据业务需要自定义的变量。

使用自定义变量

#!/bin/sh
echo "It is a test"
name="Hi Shell"
name2 = "两边都有空格"
name3 ="仅左边有空格"
echo $name
echo $name2
echo $name3

#注:1 定义变量并赋值时“=”两边都不能有空格,否则会报错,且变量值取不到。

定义数组

变量只能存一个值,而数组可以存多个值。

# 1 定义个数组并安装索引打印、打印所有元素。
#!/bin/bash
echo "It is a test"
arraydemo=("Hi" There Shell array)
echo ${arraydemo[2]}
echo ${arraydemo[*]}

#结果
It is a test
Shell
Hi There Shell array

#注:索引序号从0开始。

# 2 通过unset移除数组元素
#!/bin/bash
echo "It is a test"
arraydemo=("Hi" There Shell array)
unset arraydemo[2]
echo ${arraydemo[0]}
echo ${arraydemo[*]}

#结果
It is a test
Hi
Hi There array

命令变量

如果变量对应是某个命令,可以通过$结合“( )”来引用。也可以通过“` `”来引用。

# 取当前脚本的目录,并赋值给变量后打印出来。

#Way1 $结合“( )”,类似于执行命令。
 #!/bin/bash
echo "It is a test"
curr_dir=$(pwd)
echo $curr_dir

#Way2 ``号,类似于执行命令。

#!/bin/bash
curr_dir=`pwd`
echo $curr_dir

#结果
/home/shenliang

使用系统变量

系统变量系统级的环境变量,一般定义在/etc/profile、~/.bash_profile、~/.bash_rc内。

#打印当前JDK主目录
printenv JAVA_HOME
#结果
/home/shenliang/software/jdk1.8.0_161

变量范围

Shell的变量不仅可以作用于当前脚本,还可以被其它脚本引用。

# 1如果想一个shell脚本里的变量被另外个shell脚本调用,则需要加export关键字。
# script1.sh的内容
#!/bin/bash
var="我在脚本1里"
export var
./script2.sh

# script2.sh的内容
#!/bin/bash
echo $var

# 执行script1.sh后的结果
# ./script1.sh 
我在脚本1里

# 2 如果在script2.sh里修改同名变量的值,则此时打印的为script2.sh里的值。
# script2.sh的内容
#!/bin/bash
var="我在脚本2里"
echo $var

# 执行script1.sh后的结果
# ./script1.sh 
我在脚本2里

参数

参数是shell脚本接受的外部传递的值,即可实现脚本或者函数的动态调用。

参数类型

# 通过参数传递给脚本调用。
#!/bin/bash
echo "当前执行的文件是: $0,$1,$2"
echo "Hello $*"
echo "$#"
exit 0

#执行
./shell_case1.sh "参数1" "参数2"

#结果
当前执行的文件是: ./shell_case1.sh,参数1,参数2
Hello 参数1 参数2
2

注:1 其中$0参数代表当前文件
2 $1…$10代表shell可接受的参数
3 $* 对应所有参数的值
4 $# 对应参数的个数,比如对应上例为2。

分支判断

且与或控制多命令执行

多个命令合并执行时,通过&&(且)或者||(或)来控制整个命令的执行。

且&&连接多命令

# 用&&将ls命令和date命令结合在一起,如果ls命令执行有结果,则执行date命令,反之不执行。
ls -a | grep label && date +'%Y-%m-%d'
#结果
label.sed
2021-06-09

#如果第一命令没结果,比如grep后的关键字修改成label2,那么第二个命令,也就是date将不再执行。

ls -a | grep label2 && date +'%Y-%m-%d'

或||连接多命令

#用||将ls命令和date命令结合在一起,如果ls命令执行无结果(返回为False),则执行date命令。
ls -a | grep label2 || date +'%Y-%m-%d'
#结果
2021-06-09

test命令判断数字字符串文件

test命令用于检验某个条件是否满足,一般用于数字、字符串、文件的条件判断。

数值类型比较

# 数字类型比较,这里用eq(等号)演示。
#!/bin/bash
num1=13
num2=23
if test $num1 -eq $num2
then
echo "两数相等"
else
echo "两数不等"
fi

# 结果
两数不等

注:比较符号汇总,-eq (相等)、-ne(不等于)、-gt(大于)、-ge(大于等于)、-lt(小于)、-le(小于等于)。

字符串类型比较

# 字符串类型比较,这里用n(等号)演示。

#!/bin/bash
str1="Hello"
if test -n $str1
then
echo "字符串长度大于0"
else
echo "空字符串"
fi

#结果
字符串长度大于0

注:字符串比较汇总,=(相等)、!=(不等)、-z(空字符串时为真)、-n(字符串长度大于0时为真)。

文件比较

# 文件判断,这里用e(存在)演示。

#!/bin/bash
if test -e $1
then
echo "文件$1存在"
else
echo "文件$1不存在"
fi


# case1 
./shell_case1.sh shell_case1.sh 
#结果
文件shell_case1.sh存在

#case2
./shell_case1.sh shell_case12.sh 
#结果
文件shell_case12.sh不存在

注:文件判断符号汇总:
-e(存在)、-r(存在且可读)、-w(存在且可写)、-x(存在且可执行)、-s(存在且至少有一个字符)、-d(目录存在)、-f(文件存在且是普通文件)、-c(文件存在且是字符特殊类型文件)、-b(文件存在且是块文件)。

多条件组合

# test多条件的连接

#!/bin/bash
if test -s $1 -a 34 -gl 24
then
echo "文件$1有内容"
else
echo "文件$1无内容"
fi

#结果
文件nothing.txt无内容

注: 1 这里nothing.txt是事先touch出来的空文件。
     2 多条件组合,可以通过-a(and)且、-o(or)或、!(not)非,其中!优先级最高,-o最低。

if 条件判断语句

单if判断

# 仅含if then的判断语句, 如果参数1大于参数2则输出结果
if [ $1 -gt $2 ];
then
echo "数$1大于$2"
fi

#执行
./shell_case1.sh 34 12

#结果
数34大于12

if else 判断

# 含if else的判断语句,如果参数1大于参数2输出结果1,反之输出结果2。
#!/bin/bash
if [ $1 -gt $2 ];
then
echo "数$1大于$2"
else
echo "数$1小于$2"
fi

#执行
./shell_case1.sh 12 34

#结果
数12小于34

if elif多条件

# 通过elif then实现多分支判断。
#!/bin/bash
if [ $1 -gt 30 ];
then
echo "数$1大于30"
elif [ $1 -gt 20 ]; then
echo "数$1大于20"
elif [ $1 -gt 10 ]; then
echo "数$1大于10"
else
echo "数$1小于10"
fi

# 执行
./shell_case1.sh 32
数32大于30
./shell_case1.sh 22
数22大于20
./shell_case1.sh 12
数12大于10
./shell_case1.sh 2
数2小于10

case条件判断语句

使用case进行判断

#!/bin/bash
case $1 in [A-B])
echo "成绩优异,级别是$1";;
[C-D])
echo "成绩中等,级别是$1";;
[E-F])
echo "成绩偏下,级别是$1";;
*)
echo "成绩糟糕";;
esac

#执行
./shell_case1.sh "A"
成绩优异,级别是A
./shell_case1.sh "C"
成绩中等,级别是C
./shell_case1.sh "E"
成绩偏下,级别是E
./shell_case1.sh "G"
成绩糟糕
./shell_case1.sh "H"
成绩糟糕

注:1 这里的case和esac是一对关键字。
2 case1) 对应某个分支判断,
3 每个;;前是具体的执行语句。
4 *) 类似于If的else,即其它情况。

 

以上是关于你该认识这样的Linux_shell之变量操作符与循环分支的主要内容,如果未能解决你的问题,请参考以下文章

你该认识这样的Linux_shell函数使用案例

Linux_Shell脚本编程之设置环境变量

Linux_Shell脚本编程之read读取控制台输入

Linux_shell 编程

Linux_shell

Linux_shell