【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


目录
相关文章
|
1月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
323 9
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
181 0
Linux系统初始化脚本
|
1月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
176 2
|
1月前
|
算法 Linux Shell
Linux实用技能:打包压缩、热键、Shell与权限管理
本文详解Linux打包压缩技巧、常用命令与原理,涵盖.zip与.tgz格式操作、跨系统传文件方法、Shell运行机制及权限管理,助你高效使用Linux系统。
Linux实用技能:打包压缩、热键、Shell与权限管理
|
4月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
219 60
|
1月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
3月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
376 1
|
Shell 索引
shell脚本入门到实战(四)- 数组
shell脚本入门到实战(四)- 数组
141 0
|
Shell
shell脚本入门到实战(三) - 变量
shell脚本入门到实战(三) - 变量
161 0
|
Shell Linux 人机交互
shell脚本入门到实战(二)--shell输入和格式化输出
shell脚本入门到实战(二)--shell输入和格式化输出
669 0