Shell+VCS学习2

Shell脚本常见问题

rm -f $2~

while read line

【最佳】形如while read line;do echo $line;done <test

使用输入重定向的方式则每次只占用一行数据的内存,而且是在当前shell环境下执行的,while内的变量赋值、数组赋值在退出while后仍然有效。

name1="xiaowang"
date1="2020-05-08"
while read date
do
    read url
    read name
    name1="$name"
    date1="$date"
    echo "$date1 $name1 $url"
    echo "$date $name $url"
done < test

echo "888888 $date1 777 $name1 666  $url"

输出

2020-05-07 https://bing.ioliu.cn/photo/WildflowerWeek_ZH-CN4593499387?force=download 印克斯湖国家公园中的德克萨斯矢车菊,德克萨斯州
2020-05-07 https://bing.ioliu.cn/photo/WildflowerWeek_ZH-CN4593499387?force=download 印克斯湖国家公园中的德克萨斯矢车菊,德克萨斯州
888888 2020-05-07 777 https://bing.ioliu.cn/photo/WildflowerWeek_ZH-CN4593499387?force=download 666  印克斯湖国家公园中的德克萨斯矢车菊,德克萨斯州

read通过输入重定向,把file的第一行所有的内容赋值给变量line,循环体内的命令一般包含对变量line的处理;然后循环处理file的第二行、第三行。。。一直到file的最后一行。

还记得while根据其后的命令退出状态来判断是否执行循环体吗?

是的,read命令也有退出状态,当它从文件file中读到内容时,退出状态为0,循环继续进行;

当read从文件中读完最后一行后,下次便没有内容可读了,此时read的退出状态为非0,所以循环才会退出。

while read line 与for 循环的区别
看完上面的定义,可能很多同学会说这是不是和for循环一样,这我们作一下说明:

while read line 是一次性将文件信息读入并按行赋值给变量line ,while中使用重定向机制,文件中的所有信息都被读入并重定向给了整个while 语句中的line 变量。
for是每次读取文件中一个以空格为分割符的字符串。

读取文件内容的方法有很多,比如使用形如:for line in $(<file); do echo $line; done的方法,据说这种方法效率最高,具体可以参考这篇博客,这个说了几种while read和for的比较。

https://blog.csdn.net/u014650722/article/details/51563823
https://blog.csdn.net/Miracle_ps/article/details/105996799
https://www.jianshu.com/p/838d2ffc6537

Shell 输入/输出重定向

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

重定向命令列表如下:
命令说明
command > file将输出重定向到 file。
command < file将输入重定向到 file。
command >> file将输出以追加的方式重定向到 file。
n > file将文件描述符为 n 的文件重定向到 file。
n >> file将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m将输出文件 m 和 n 合并。
n <& m将输入文件 m 和 n 合并。
<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输入。
需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
输出重定向

重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:

command1 > file1

上面这个命令执行command1然后将输出的内容存入file1。

注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。

实例

执行下面的 who 命令,它将命令的完整的输出重定向在用户文件中(users):

$ who > users

执行后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的文件。

你可以使用 cat 命令查看文件内容:

$ cat users
_mbsetupuser console  Oct 31 17:35 
tianqixin    console  Oct 31 17:35 
tianqixin    ttys000  Dec  1 11:33 

输出重定向会覆盖文件内容,请看下面的例子:

$ echo "菜鸟教程:www.runoob.com" > users
$ cat users
菜鸟教程:www.runoob.com
$

如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:

$ echo "菜鸟教程:www.runoob.com" >> users
$ cat users
菜鸟教程:www.runoob.com
菜鸟教程:www.runoob.com
$
输入重定向

和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

command1 < file1

这样,本来需要从键盘获取输入的命令会转移到文件读取内容。

注意:输出重定向是大于号(>),输入重定向是小于号(<)。

实例
接着以上实例,我们需要统计 users 文件的行数(在命令行中通过 wc -l 命令计算行数:

),执行以下命令:

$ wc -l users
       2 users

也可以将输入重定向到 users 文件:

$  wc -l < users
       2 

注意:上面两个例子的结果不同:第一个例子,会输出文件名;第二个不会,因为它仅仅知道从标准输入读取内容。

command1 < infile > outfile

同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。

/dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

$ command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:

$ command > /dev/null 2>&1

#* ,##* ,#* ,##* ,% * ,%% *

介绍下Shell中的KaTeX parse error: Expected 'EOF', got '#' at position 4: {}、#̲#和%%使用范例,本文给出了不…{ }分别替换得到不同的值:
${file#* /}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##* /}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file#* . }:删掉第一个 . 及其左边的字符串:file.txt
${file## * .}:删掉最后一个 . 及其左边的字符串:txt
${file%/ * }:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/ * }:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%. * }:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
#是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)

比如:

${file%%#*}
#删除第一个#以及右面的内容

单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt

hthttps://blog.csdn.net/jiezi2016/article/details/79649382
hthttps://blog.csdn.net/wangzhaotongalex/article/details/73321766

VCS指令

1、+incdir+
+incdir+ `include文件的搜索目录。
-incdir 在指定目录下搜索include文件
方便在
2、-v filename
-v 指定一个.v格式的库文件,VCS会来这个文件中找源代码中例化的但在源代码中找不到的module,这里一个文件可以里面包含很多module。
filelist列表中 -v xxx/xxx/fifo.v 表示该文件里面只有一个module,且module名为fifo。
filelist列表中直接引用 xxx/xxx/fifo.v 则对文件中的module名没有限制。
3、-y directory
-y 指定一个库文件目录,目录下的文件名和module名要一致,且要用+libext+来指定文件类型,这里的.v文件里面就只能放一个和文件名同名的module,VCS会来这个目录下找源代码中例化的但在源代码中找不到的module。
4、+libext+
+libext+ .v+ .vg+ .sv 指定文件类型。
5、-f filename
指定文件类型为.f。

Linux 命令大全

sed

Linux sed 命令是利用脚本来处理文本文件。

sed 可依照脚本的指令来处理、编辑文本文件。

Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数说明:

-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
动作说明:

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何东东;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g 就是啦!

shell脚本之sed详解 (sed命令 , sed -e , sed s/ new / old / … )
https://www.cnblogs.com/tureno/articles/6677942.html

shell 中| && || () {} 用法以及shell的逻辑与或非

https://www.jianshu.com/p/617c1ee1e46e

| 运算符

管道符号,是unix一个很强大的功能,符号为一条竖线:“|”。
用法:
command 1 | command 2
他的功能是把第一个命令command 1执行的结果作为command2的输入传给command 2,例如:

$ ls -s|sort -nr (请注意不要复制$符号进去哦)

-s 是file size,-n是numeric-sort,-r是reverse,反转
该命令列出当前目录中的文档(含size),并把输出送给sort命令作为输入,sort命令按数字递减的顺序把ls的输出排序。

&& 运算符:

格式

command1  && command2

&&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功&&那么执行这个命令”。
语法格式如下:

command1 && command2 && command3 ...
  1. 命令之间使用 && 连接,实现逻辑与的功能。
  2. 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。
  3. 只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执行。
|| 运算符:

格式

command1 || command2

||则与&&相反。如果||左边的命令(command1)未执行成功,那么就执行||右边的命令(command2);或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。

命令之间使用 || 连接,实现逻辑或的功能。

只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。

只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。

() 运算符:

如果希望把几个命令合在一起执行,shell提供了两种方法。既可以在当前shell也可以在子shell中执行一组命令。
格式:

(command1;command2;command3....)               多个命令之间用;分隔
  1. 一条命令需要独占一个物理行,如果需要将多条命令放在同一行,命令之间使用命令分隔符(;)分隔。执行的效果等同于多个独立的命令单独执行的效果。
  2. () 表示在当前 shell 中将多个命令作为一个整体执行。需要注意的是,使用 () 括起来的命令在执行前面都不会切换当前工作目录,也就是说命令组合都是在当前工作目录下被执行的,尽管命令中有切换目录的命令。
  3. 命令组合常和命令执行控制结合起来使用。
{} 运算符:

如果使用{}来代替(),那么相应的命令将在子shell而不是当前shell中作为一个整体被执行,只有在{}中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子shell中执行,否则在当前shell执行。
它的一般形式为:

{ command1;command2;command3… }      注意:在使用{}时,{}与命令之间必须使用一个空格

示例5中,使用{}则在子shell中执行了打印操作

shell的逻辑与或非
if [ ! 表达式 ]
if [ ! -d $num ]        如果不存在目录$num

   逻辑与 –a              条件表达式的并列
if [ 表达式1  –a  表达式2 ]

   逻辑或 -o               条件表达式的或
if [ 表达式1  –o 表达式2 ]
   表达式与前面的=  != -d –f –x -ne -eq -lt等合用
   逻辑符号就正常的接其他表达式,没有任何括号( ),就是并列
if [ -z "$JHHOME" -a -d $HOME/$num ]
   注意逻辑与-a与逻辑或-o很容易和其他字符串或文件的运算符号搞混了

https://www.cnblogs.com/aaronLinux/p/8340281.html
链接:https://www.jianshu.com/p/617c1ee1e46e

yes| ···

在命令中使用yes

让我们以Ubuntu软件包管理器apt-get为例。 要安装应用程序而不必在安装过程中半按“ y”,将按以下方式使用yes :

yes | sudo apt-get install fortune-mod

使用apt-get的-y (假设是)选项可以实现相同的结果:

sudo apt-get -y install fortune-mod
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值