基础语法
上一篇已经讲到了数组,今天我们接着来学习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、函数参数

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

被折叠的 条评论
为什么被折叠?



