【Linux篇】Shell脚本语法< 2 >

简介: 在安卓源码里,离不开两个东西,一个就是.sh文件,还有一个就是.mk文件。这两个文件各持有一个语法,一个是Makefile语法,一个是Shell脚本语法。这两个是真的让我头疼,就像看天书一样,呜呜呜。

4、运算符


1)算术运算符


就是加减乘除and so on。

条件表达式要放在方括号之间,并且要有空格,例如:[$a==$b]是错误的,必须写成[ $a == $b ]


a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
   echo "a 等于 b"
fi
if [ $a != $b ]
then
   echo "a 不等于 b"
fi


2)关系运算符


关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

-eq:相等

-ne:不相等

-gt:左边大于右边

-lt:左边小于右边

-ge:左边大于等于右边

-le:左边小于等于右边

a=10
b=20
if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi


3)布尔运算符


!:非

-o:或

-a:与

a=10
b=20
if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
   echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi


4)逻辑运算符

a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi


5)字符串运算符


a="abc"
b="efg"
#检测两个字符串是否相等,相等返回true
if [ $a = $b ]
then
   echo "$a = $b : a 等于 b"
else
   echo "$a = $b: a 不等于 b"
fi
#检测两个字符串是否不相等,不相等返回true
if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi
#检测字符串长度是否为0,为0返回true
if [ -z $a ]
then
   echo "-z $a : 字符串长度为 0"
else
   echo "-z $a : 字符串长度不为 0"
fi
#检测字符串长度是否不为0,不为0返回true
if [ -n "$a" ]
then
   echo "-n $a : 字符串长度不为 0"
else
   echo "-n $a : 字符串长度为 0"
fi
#检测字符串是否不为空,不为空返回true
if [ $a ]
then
   echo "$a : 字符串不为空"
else
   echo "$a : 字符串为空"
fi


6)文件测试运算符


文件测试运算符用于检测 Unix 文件的各种属性。


89100c20fae247e9bfa0c7d3f431f7ad.png


file="/var/www/runoob/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi


5、输入输出


1)read(输入)


read -p "input your name:" str
echo "read name: $str"  


2)echo(输出)


echo `date`


3)printf(输出)


格式说明:

printf  format-string  [arguments...]


参数说明:

format-string: 为格式控制字符串

arguments: 为参数列表

举个栗子:

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg 


%-10s:指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

%-4.2f :指格式化为小数,其中 .2 指保留2位小数

%s :输出一个字符串

%d :整型输出

%c :输出一个字符

%f :输出实数,以小数形式输出


# format-string为双引号
printf "%d %s\n" 1 "abc"
# 单引号与双引号效果一样
printf '%d %s\n' 1 "abc"
# 没有引号也可以输出(没换行)
printf %s abcdef
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用(没换行)
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"


1 abc

1 abc

abcdefabcdefabc

def

a b c

d e f

g h i

j

and 0


printf的特殊用法


54a319d8ed5c4afd890cb0f379a4dd19.png



6、流程控制


1)if


正常格式:

if 条件1
then
    命令1 
    命令2
    ...
    命令N 
fi


简写一行模式:

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi


多if-elseif-else模式:

if 条件1
then
    命令1
elif 条件2 
then 
    命令2
else
    命令N
fi


if else 的 ["$a" -gt "$b"]判断条件中大于使用 -gt,小于使用 -lt。

if else 的 ((a>b)) 判断条件中大于和小于可以直接使用 > 和 <。

if else 语句经常与 test 命令结合使用。


特殊:test命令


test命令是一个用于在Bash shell中测试条件的内置命令,通常被用于控制流程的判断和分支。

test命令有多种形式,最基本的语法如下:

test+选项+expression


[选项+expression ]


这里的expression表示一个特定的测试条件,可以是文件测试、字符串比较、数字比较等不同类型的操作。

test命令有多种选项可以用于测试条件,这里列举一些比较常见的选项:

-n string:判断字符串是否非空。


-z string:判断字符串是否为空。


-f file:判断文件是否存在且是普通文件。


-e file:判断文件是否存在。


-d file:判断文件是否存在且是目录。


-r file:判断文件是否存在且可读。


-w file:判断文件是否存在且可写。


-x file:判断文件是否存在且可执行。


-s file:判断文件是否存在且不为空。


这些选项可以用于组合不同类型的条件表达式,并配合逻辑运算符(如&&、||)实现复杂的控制流程。例如:

filename="example.txt"
if test -f "$filename" && test -r "$filename"; then
  echo "yes"
else
  echo "no"
fi
#或者
if [ -f "$filename" ] && [ -r "$filename" ]; then
  echo "yes"
else
  echo "no"
fi
#或者
if [ -f example.txt ] && [ -r example.txt ]; then
  echo "yes"
else
  echo "no"
fi
#或者
#这里使用-a选项(即逻辑与)连接两个表达式,表示需要同时满足多个条件。
if [ -f example.txt -a -r example.txt ]; then
  echo "yes"
else
  echo "no"
fi

这个例子检查文件myfile是否存在并且可读,如果两个条件都成立,就输出"yes",否则输出"no"。

需注意的是,在test命令中接受的所有参数都必须放在方括号内,每个参数之间必须用空格隔开,并保证最后一个参数与方括号之间有一个空格或其他分隔符。

需要注意的是,在bash shell中可以使用方括号[]来代替test命令,实现同样的效果。这就是上面的例子使用[ -f file.txt ]的原因。



2)for


一般格式:

for var in item1 item2 ... itemN
do
    命令1
    命令2
    ...
    命令N
done


简写一行模式:

for var in item1 item2 ... itemN; do 命令1; 命令2… done;


for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done


#!/bin/bash
for str in This is a string
do
    echo $str
done


This

is

a

string



3)while


一般格式:

while 条件
do
    # 可以在这里添加自己的命令
done


#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done


echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
    echo "是的!$FILM 是一个好网站"
done


在 Linux 终端中,按下 Ctrl+d 键可以执行以下不同的功能,具体取决于当前终端的上下文:

1.输入结束标志:当您想要从终端输入流中退出时,按下 Ctrl+d 可以指示输入结束。例如,在命令行中通过管道(|)将输出重定向到某个命令或文件中时,您可以按 Ctrl+d 表示完成输入并开始处理。

2.终止一个前台进程:如果您正在运行一个前台进程并想要强制停止它,可以使用 Ctrl+d 组合键来发送 SIGINT 信号。该信号会告诉应用程序停止当前操作和任何正在进行的数据处理,并退出进程。

3.登出当前用户:在大多数 Linux 系统中,按下 Ctrl+d 可以表示退出当前登录用户。这通常与 shell 或其他 CLI 应用程序一起使用。

总之,Ctrl+d 多种多样的作用,具体取决于您当前使用的终端上下文。在使用时,请注意其所附带的含义,并小心操作。

无限循环:

while :
do
    # 可以在这里添加自己的命令
done
while true
do
    # 可以在这里添加自己的命令
done
for (( ; ; ))
do
   echo "loop will run forever unless you terminate it with Ctrl+c"
   # 可以在这里添加自己的命令
done


4)until


until 循环执行一系列命令直至条件为 true 时停止。


until 循环执行一系列命令直至条件为 true 时停止。

until 条件
do
    # 可以在这里添加自己的命令
done


a=0
# 输出0-9
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done


5)case


值可以为变量或常数


一般格式:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac


echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac


site="runoob"
case "$site" in
   "runoob") echo "菜鸟教程"
   ;;
   "google") echo "Google 搜索"
   ;;
   "taobao") echo "淘宝网"
   ;;
esac


6)break和continue


结束循环和跳出一层循环。同Java


目录
相关文章
|
19天前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
58 1
|
5天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
20 2
6种方法打造出色的Shell脚本
|
2天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
24天前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
52 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
10天前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
35 6
|
6天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
21天前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
29 1
|
1月前
|
存储 运维 监控
自动化运维:使用Shell脚本简化日常任务
【9月更文挑战第35天】在IT运维的日常工作中,重复性的任务往往消耗大量的时间。本文将介绍如何通过编写简单的Shell脚本来自动化这些日常任务,从而提升效率。我们将一起探索Shell脚本的基础语法,并通过实际案例展示如何应用这些知识来创建有用的自动化工具。无论你是新手还是有一定经验的运维人员,这篇文章都会为你提供新的视角和技巧,让你的工作更加轻松。
37 2
|
28天前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
20 0
|
6月前
|
Shell 索引
shell脚本入门到实战(四)- 数组
shell脚本入门到实战(四)- 数组