例如有一个学生报表信息,包含ID、Name、age、gender:
zql@zql-PC:~$ cat student.txt
ID Name gender age
1 zql M 19
2 tr M 19
3 kgm M 21
4 Lisa W 19
zql@zql-PC:~$ cut -f 2 student.txt
Name
zql
tr
kgm
Lisa
zql@zql-PC:~$ grep -v "Name" student.txt | cut -f 2
zql
tr
kgm
Lisa
zql@zql-PC:~$ grep -v "Name" student.txt | cut -f 2,4
zql 19
tr 19
kgm 21
Lisa 19
zql@zql-PC:~$ cut -f 2,3 student.txt
Name gender
zql M
tr M
kgm M
Lisa W
#!/bin/bash
#
if grep $USER /etc/passwd
then
echo "是否存在特定的用户?"
echo "存在特定的用户,这是用户$USER下面的sh文件:"
echo
ls $tUSER *.sh
else
echo "这个$USER不存在系统中。"
echo
fi
echo "we are outside the if statement."
执行脚本
zql@zql-PC:~$ testuser.sh
zql:x:1000:1000:zql,,,:/home/zql:/usr/bin/zsh
是否存在特定的用户?
存在特定的用户,这是用户zql下面的sh文件:
calculate_date.sh test1.sh test2.sh test3.sh test.sh testuser.sh
we are outside the if statement.
if语句的嵌套
shell和其他的语言一样,逻辑结构中可以嵌套多个if
例
文件test4.sh
zql@zql-PC:~$ cat test4.sh
#!/bin/bash
#
if grep $USER /etc/passwd
then
echo "是否存在特定的用户?"
echo "存在特定的用户,这是用户下面的sh文件:"
ls $USER *.sh
if
echo "当前有那些程序在运行?"
then
ps
fi
else
echo "不存在特定的用户。"
fi
echo "程序执行完成,退出!"
#!/bin/bash
#
#检查文件的属主
if [ -O /etc/passwd ]
then
echo "You are the owner of the /etc/passwd file."
else
echo "Sorry,you are not /etc/passwd file's owner"
fi
调用脚本
zql@zql-PC:~$ ./whohost.sh
Sorry,you are not /etc/passwd file's owner
zql@zql-PC:~$ whoami
zql
zql@zql-PC:~$ ls -o /etc/passwd
-rw-r--r-- 1 root 3228 2月16日 10:34 /etc/passwd
#此文件的属主是root用户,自身用户zql不是属主
检查文件属组-G
-G检查文件的属组,如果与用户的默认组匹配,测试成功。
例
┌──(zql㉿kali)-[~/sh]
└─$ cat grouphost.sh
#!/bin/bash
#
echo "检查按文件属组..."
sleep 0.3
if [ -G $HOME/sh ]
then
echo "文件|目录$HOME/sh 在默认组..." ; sleep 0.3
else
echo "Sorry,你默认的分组和$HOME/sh 文件|目录的组是默认的..."
fi
cut 列提取
cut连接文件并打印到标准输出设备上
补充说明
cut命令 用来显示行中的指定部分,删除文件中指定字段。cut经常用来显示文件的内容,类似于下的type命令。
说明:该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数file所指 明的文件,将它们的内容输出到标准输出上;其二是连接两个或多个文件,如cut fl f2 > f3将把文件fl和几的内容合并起来,然后通过输出重定向符“>”的作用,将它们放入文件f3中。
当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用more等命令分屏显示。为了控制滚屏,可以按Ctrl+S键,停止滚屏;按Ctrl+Q键可以恢复滚屏。按Ctrl+C(中断)键可以终止该命令的执行,并且返回Shell提示符状态。
语法
cut(选项)(参数)
选项
例
注意:
cut命令不会识别空格
shell逻辑控制
6.1 if-then语句
shell之中的逻辑控制语句if-then和其他语言的逻辑控制语句不太一样,他的语法结构是这样的:
语法1
这结构是不是焕然一新,if语句之后的是一个等式,正常情况下其求值的结果是True和False,但是shell里面不是这样的,当在shell中if语句回运行if之后的命令,如果该命令的****退出码为0,命令将会成功地运行,then部分部分的命令就会被执行,如果该命令的状态码为其他的值,那么then部分的命令将不会执行,也就是说控制if-then的是退出码。
例
文件test1.sh
调用脚本
可以看见前后两条命令都执行了,如果其中有一个命令错误会发生什么呢?
test1.sh
掉用脚本
test2.sh
调用脚本
综上所述:
语法2
例
test3.sh
执行脚本
6.2 if-then-else语句
语法
此时的逻辑语句依然受到状态码的控制,当状态码为0的时候就执行then部分的语句,当状态码不为0的时候执行else的语句。
例
文件testuser.sh
执行脚本
if语句的嵌套
shell和其他的语言一样,逻辑结构中可以嵌套多个if
例
文件test4.sh
脚本调用
6.3 elif语句
语法
例
文件test7.sh
脚本运行
由于我的Linux还未安装http,所以会执行错误。
6.4 利用test命令测试不同的条件
语法
condition 是test要测试的一系列参数的值。
例
文件test6.sh
调用脚本
字符大小写处理
例
文件test8.sh
脚本调用
运行以上脚本,发现大写字母小于小写字母,原因是排序是由字符编码决定大小的。
-n和-z可以方便地用于检查一个变量是否为空。
例
文件test9.sh
脚本调用
6.5 数值比较与字符串比较
利用test命令可以进行数值比较。
数值比较
字符比较
6.6 文件比较
检查目录-d
例
文件test10.sh
执行脚本
检查对象是否存在-e
例
文件update-file.sh
脚本调用
例
文件update-file2.sh的内容
调用脚本
检查是否可读-r
文件readfile.sh
脚本调用
检查空文件-s
例
文件emptyfile.sh
调用脚本
检查是否可写入-w
文件 writefile.sh
调用脚本
检查是否可执行-x
文件x-file.sh
调用脚本
检查文件属主-O
例
调用脚本
检查文件属组-G
例
调用脚本
检查文件日期-nt与-ot
例
调用脚本
复合条件测试
if-then语句允许布尔逻辑测试。
语法
例
调用脚本
括号与方括号
单括号
单括号允许if语句使用子shell,在bash shell执行命令之前,会先船舰一个子shell,然后再其中执行命令。如果命令成功结束,就会有个退出状态码,只有状态码为0的时候,if语句的then部分才会执行。
例
调用脚本
注意第一次使用echo $BASH_SUBSHELL是再当前的shell中执行的,当进入if语句后执行的就是子shell。所以第一次输出的是0,第二次输出的是1。
双括号
双括号命令允许在比较过程中使用高级数学表达式。test命令在进行比较的时候只能使用简单的算术操作。
双方括号
双方括号命令提供了针对字符串比较的高级特性。双方括号的格式如下:
expression可以使用test命令中的标准字符串比较。除此之外,它还提供了test命令所不具备的另一个特性——模式匹配。
6.7 case语句
语法
case命令会将指定变量与不同模式进行比较。如果变量与模式匹配,那么shell就会执行为该模式指定的命令。你可以通过竖线运算符在一行中分隔出多个模式。星号会捕获所有与已知模式不匹配的值。
说实话这case语句是真的复杂,我还不如直接if-else