《shell脚本学习指南》自学笔记——入门

《shell脚本学习指南》自学笔记——入门这个是我自己自学的一点笔记和心得 如果有什么错误请大家指出 谢谢 1 一个简单的脚本 who 列出登录的用户 下面利用管道 who wc l 将列出登录的用户数量 who 的输出 成了 wc 的输入 下一步 将管道转变为独立的命令建立管道文件 用 cat 复制终端的输入 catnusers 然后写入内容 who wc l 以 D 作

#这个是我自己自学的一点笔记和心得,如果有什么错误请大家指出,谢谢。

(1)一个简单的脚本


who

#列出登录的用户,下面利用管道
who | wc -l
#将列出登录的用户数量。who的输出,成了wc的输入。

下一步,将管道转变为独立的命令
建立管道文件,用cat复制终端的输入: cat > nusers
然后写入内容: who | wc -l
以 ^D 作为文件结束符
接着改掉此管道文件的权限,让文件可执行:chmod +x nurses
最后便可以直接进行测试了: ./nurses 

注意:
(1)写入管道文件时不要输入错误,否则就算用delete或backspace也不管用了,只能将此文件rm掉再重写了。
(2)我们的nusers shell脚本并不是编译型程序,内核是无法执行这种格式的,所以shell会启动一个新的/bim/sh(标准shell)副本来执行该程序。这种方法并不适用于拥有多个shell的系统,所以我们需要一种方式来告知内核应该以什么shell来执行所指定设立了脚本,方法是:在脚本文件的第一行的开头处使用#!这两个字符。

(2)#!


shell脚本通常一开始都是#!/bin/sh。

学习中的一些 陷阱:#!这一行的长度在不同的系统中是有不同的限制的;不能在选项最后有任何空白,这些空白也会跟着选项一起传递;最好写上完整路径名称。

下面是一个修订过的nurse程序:

#!/bin/sh - who | wc -l

其中,选项  – 表示没有选项,这样可以避免一些欺骗式攻击。

(3)命令与参数


shell会沿着$PATH来寻找命令

命令书写规则:
(1)空白隔开命令行中各个组成部分
(2)命令名称是命令行的第一个项目,其后跟着选项
(3)选项开头为一个减号,然后跟着字母,字母可以为多个
(4)最后,分号用来分隔同一行里的多条命令,shell会依次执行这些命令,。如果用的是&符号,shell就将在后台执行其前面的命令,这就意味着shell不需要等到该命令完成,就可以继续执行下一个命令。

(4)变量


shell变量无长度限制,赋值时不允许加入空格,即是:变量名,紧接着=字符,最后是新值,当赋予的值有空格时,需加上引号
要取出变量的值时,在变量名前加上$字符
例:Full_Name=”fengxiaoke neu”
   Copy_Name=$Full_Name(此处加不加双引号都没关系)
注意:当将几个变量连接起来时,就必须使用双引号了:Full_Name=”$First $Second $Final”

echo可将变量的值输出,如:echo $Full_Name;echo “Enter the name:”。echo会提供换行符,echo里面有一些转义字符,可以谷歌一下。

对于比较复杂的输出,我们可以使用printf。

printf命令模仿了C library里的printf(),它几乎复制了其所有的功能。
例:printf “%s,%s,I’m happy to help you\n” Hello world
输出:Hello,world,I’m happy to help you

(5)I/O重定向


<  改变标准输入:program < file可将program的标准输入改为file
>  改变标准输出:program > file可将program的标准输出改为file,在file不存在时会新建一个file,如果已存在,则会覆盖原有的数据。
>>  附加到文件:program >> file可将program的标准输出附加到file的结尾处,其处理file的存在与否的方式只有在已存在时不同,file已存在时,不会覆盖数据,而是附加到结尾。
|  建立管道:program1 | program2可将program1的标准输出修改为program2的标准输入,这样管道可以使得执行速度比使用临时文件的程序快上十倍。

#< 和 > 可以被想象成漏斗,数据会从大的一端进入,由小的一端出来。

(6)/dev/null和/dev/tty


/dev/null是位桶,传送到此文件的数据都会被系统丢掉。当数据写入到这个文件时,程序会认为它已成功完成写入操作,其实什么事情都没有发生过;相反的,如果读取这个文件则会立即返回EOF。
/dev/tty被打开时,系统会自动将其重定向到一个终端。

(7)看看下面的命令做了什么


$ cd
$ mkdir bin
$ mv nusers bin
$ PATH=$PATH:$HOME/bin
$ nusers

(8)继续看看下面的命令又做了什么


$cat > Find_User
#!/bin/sh
#find a user
who | grep $1
^D

$sudo chmod +x Find_User
$./Find_User fengxiaoke
$mv Find_User $HOME/bin
(此程序还不完美,我们需要给它加上测试命令行参数数目的功能)

(9)初学执行跟踪


set -x  将执行跟踪功能打开

set +x  将执行跟踪功能关闭

一个简单的例子:
$car > Set_Test.sh
#!/bin/sh
set -x  #打开跟踪功能
echo 1st echo  #执行一些操作

set +x  #关闭跟踪功能
echo 2nd echo  #执行一些操作
^D

$sudo chmod +x Set_Test.sh

$./Set_Test.sh

+ echo 1st echo 被跟踪的第一行
1st echo  命令的输出
+ set +x  被跟踪的下一行
2nd echo  下一个命令的输出

























































































































































































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221315.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午6:24
下一篇 2026年3月17日 下午6:25


相关推荐

  • 数字时钟校时功能_公务员考试考场有钟表吗

    数字时钟校时功能_公务员考试考场有钟表吗数字时钟系统—标准化考场自动校时同步时钟

    2022年8月3日
    11
  • matlab plot函数详解取值范围_matlab为什么plot不出来图

    matlab plot函数详解取值范围_matlab为什么plot不出来图 在matlab中,plot函数用来绘制二维图像。1.plot默认格式 plot(x,y)这种格式中,若x,y是向量,则它们必须具有相同的长度。函数将以x为横轴,绘制y。                  若x,y都是矩阵,则它们必须具有相同的尺寸,plot函数将针对x的各列绘制y的每列。更确切的说,将x和y的对应的各列取出来,绘制曲线。比如x和y分别为n*n…

    2022年10月16日
    7
  • 玩转OpenClaw|云上OpenClaw最全教程合辑

    玩转OpenClaw|云上OpenClaw最全教程合辑

    2026年3月12日
    3
  • 10个linux常用命令_shell常用的命令

    10个linux常用命令_shell常用的命令文章目录20个linux常用命令1.ls:列出文件list2.cd:切换目录changedirectory3.cp:复制copy4.mv:移动move5.rm:移除,删除remove6.mkdir:创建文件夹makedirectory7.rmdir:移除,删除文件夹removedirectory8.chown:更改所有者changeowner9.chmod:更改文件的权限模式changemode10.find:查找11.|:管道12.grep:按行查找并匹配13.tar:

    2022年10月3日
    4
  • 电压电流转换检测「建议收藏」

    电压电流转换检测「建议收藏」电流可以转换成电压,电压也可以转换成电流。图十就是这样一个电路。上图的负反馈没有通过电阻直接反馈,而是串联了三极管Q1的发射结,大家可不要以为是一个比较器就是了。只要是放大电路,虚短虚断的规律仍然是符合的!由虚断知,运放输入端没有电流流过,则(Vi–V1)/R2=(V1–V4)/R6……a同理(V3–V2)/R5=V2/R4……b由虚短知V1=V2……c如果R2=R6,R4=R5,则…

    2022年6月2日
    40
  • js中用正则表达式替换字符串中所有指定字符串

    js中用正则表达式替换字符串中所有指定字符串用正则表达式可以用 js 中的 RegExp 对象 有两个参数 第一个参数指定了正则表达式的模式或其他正则表达式 第二个参数是可选的 包含属性 g i 和 m 分别用于指定全局匹配 区分大小写的匹配和多行匹配 想要选择所有指定字符串 第二个参数就要填 g varstart 010 varrep 10 start start replace new

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号