你该认识这样的Linux_shell之变量操作符与循环分支
Posted ShenLiang2025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你该认识这样的Linux_shell之变量操作符与循环分支相关的知识,希望对你有一定的参考价值。
Linux shell之变量与操作符
声明与简介
Shell是系统的用户界面,它提供了用户跟内核进行交互的桥梁。Shell是一个命令解释器,它接收用户输入的命令并送到内核去执行。
本文主要介绍围绕Shell的变量、参数、操作符、分支循环来展开,主要介绍变量的定义、使用;参数的使用、常见的操作符、分支与循环的常见使用方法。
注: 至少有一台linux环境,当前验证环境是Centos 8。
定义变量
这里的变量区别于系统变量,是用户根据业务需要自定义的变量。
使用自定义变量
#!/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之变量操作符与循环分支的主要内容,如果未能解决你的问题,请参考以下文章