shell编程(下)

基础语法

上一篇已经讲到了数组,今天我们接着来学习shell编程的基本语法

shell运算符:

1、算术运算符
2、关系运算符
3、布尔运算符
4、逻辑运算符
5、字符串运算符

echo命令的基本用法

echo命令用于在终端或脚本中输出文本或变量的值。默认情况下,它会将输入的字符串打印到标准输出(屏幕),并在末尾添加换行符。

1、语法示例
echo "Hello, World!"

输出结果为:

Hello, World!
2、禁用换行符

echo命令自带了换行,通过-n选项可以禁止echo在输出末尾添加换行符。

echo -n "No newline"
3、输出变量内容

echo可以使用$显示环境变量或用户定义变量的值。在shell中变量和对应的值存储在符号表中,以键值对的形式存储。$变量表示获得变量的值。

name="Alice"
echo "My name is $name"

输出结果为:

My name is Alice
4、转义特殊字符

使用-e选项启用转义字符解析,例如\n(换行)、\t(制表符)。

echo -e "Line 1\nLine 2"

输出结果为:

Line 1
Line 2
5、输出到文件

通过重定向符号(>>>)将echo的输出保存到文件。

echo "Save this text" > output.txt  # 覆盖写入
echo "Append this text" >> output.txt  # 追加写入
6、不同Shell的差异

echo的行为可能因Shell不同而略有差异:

  • Bash:默认不支持转义字符,需加-e选项。
  • Zsh:通常与Bash行为一致。
  • Dash/Sh:部分版本可能不支持-e-n选项。
7、替代方案(printf)

若需更稳定的格式化输出,推荐使用printf命令:

printf "Name: %s\nAge: %d\n" "Bob" 25

printf 的核心语法是:printf "格式化字符串" 参数1 参数2 ...

这里%s表示字符串类型的占位符,用于接收后面的参数Bob。

%d是整数占位符,用于接收参数25。

输出结果为:

Name: Bob
Age: 25

read命令基础用法

read是Bash中用于从标准输入或文件中读取数据的命令,可将输入内容赋值给变量。

read命令的原生行为是:从标准输入中读取一行内容,然后按空格 / 制表符分割后赋值给多个变量。默认的标准输入是键盘,也就是说read会读取键盘输入的一行内容。

1、基本语法
read [选项] 变量名

示例

read name  # 等待用户输入,内容存入变量name
echo "Hello, $name"

2、常用选项
  • -p "提示信息":显示提示语后等待输入。

    read -p "Enter your name: " name
    
  • -s:隐藏输入内容(如密码)。

    read -s -p "Enter password: " pass
    
  • -a 数组名:将输入内容按空格分割为数组。

    read -a arr
    echo "First element: ${arr[0]}"
    
  • -t 秒数:设置超时时间,超时后退出。

    read -t 5 -p "Input within 5 seconds: " input
    
  • -n 字符数:限制输入的字符数。

    read -n 3 -p "Enter 3 chars: " chars
    
3、读取文件内容

通过重定向或循环逐行读取文件:

while read line; do
  echo "$line"
done < filename.txt

这段代码通过while循环,读取行的内容,然后输出。循环后面 < filenamen.txt  通过重定向<,把文件filename.txt作为输入,也就是循环语句读取的内容。

4、多变量输入

输入内容按空格分割并赋值给多个变量:

read var1 var2 var3 <<< "one two three"
echo "$var1, $var2, $var3"  # 输出:one, two, three

这里做一个关于<<<的知识点补充:

test命令

1、基本用法

2、实例

a=1;b=2

if test $a -eq $b

这就是shell中的条件判断,这和python等语言不一样,这个test是必须要写的,因为shell本质上是命令解释语言,如果不加test,shell会先把命令转化为:if 1 -eq 2

然后shell 就会开始查找1这个命令,事实上并没有这个命令,所以会报错。

test可以用[ ]代替,两者作用是等价的:if [ $a -eq $b ],不过需要注意的是,【】中的空格不能省略,否则会报错。

原因:[ 其实是 test 命令的硬链接(系统中/bin/[是一个可执行文件),本质也是一个命令,因此 [ 后面必须加空格(区分命令和参数),] 前面也必须加空格(表示参数结束)。

3、补充 [[]] 和 (( )) 两种更友好的写法

除了 test 和 [],Bash 中还有更易用的扩展写法,能让条件判断更灵活:

  • [[]]:Bash 专属,是 [] 的增强版,支持字符串的通配符 / 正则匹配,且对变量空值的处理更安全;

    bash

    运行

    if [[ $a -eq $b ]]; then echo "相等"; else echo "不相等"; fi
    
  • (( )):Bash 算术命令,专门用于数值比较,支持==/>/<等更直观的运算符,无需加空格(更接近 Python 语法);

    bash

    运行

    if (( a == b )); then echo "相等"; else echo "不相等"; fi
    

到这里,我们基本掌握了shell语言的基本语法,接下来学习shell中的流程控制。

流程控制

1、if条件判断

解释一下第二块的代码:

前面已经讲过,shell中是不能直接进行条件判断的,需要使用test命令,这里我们用的[ ]效果一样,然后条件判断【 】的内部是我们的$符号的用法,返回命令执行的结果,最内层()里面首先是ps -ef命令(process statu)意思是查看进程状态,参数-ef是参数e (every,所有)和参数f(full,完整格式)的合并写法,整个命令表示以完整格式查看系统所有进程。| 是 Shell 中的管道符,核心作用是:将前一个命令的标准输出,作为后一个命令的标准输入,实现多个命令的 “串联执行”。|将 ps -ef 的输出,传递给后面的 grep -c "ssh"grep -c "ssh":从接收到的进程信息中,统计包含 “ssh” 的行数(即 ssh 相关进程数)。

最后fi表示条件判断的结束,shell中有很多这样的例子,将语句反过来写表示结束。

elif的格式:

其他几点注意事项:

2、for循环

3、while循环

let命令的三种等价写法:

4、until循环
5、case...esac 语句
6、跳出循环

shell函数

1、定义

2、实例

3、函数参数

这和前面的脚本传参比较像,主要还是通过$完成。当然也有特殊符号:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值