day1

分号和&的区别

  • 分号可用来分隔同一行里多条命令。shell会依次执行这些命令
  • &可用来分隔同一行里多条命令。但是shell不会等待之前的命令执行完

变量

  • 变量赋值方式:变量名称=字符

    • 等号前后不能有空格
    • 字符值如果有空格,则需要使用双引号将变量包围
  • 获取变量值方式:$变量名

echo

  • 语法
echo [string...]
  • 用途
    • 产生shell脚本产生
  • 行为模式
    • echo将各个参数打印到标准输出,参数之间以一个空格隔开,并以换行符结束。它会解释每个字符串里的转义序列。
echo "Enter your name: \c"
echo "yangshimiao"
echo "Enter your name:"
echo "Enter your name:\t"
echo "Enter your name:\f"
echo "\f"
echo test
# \c、\t、\f都是转义字符。如果想要显示\,需要两个反斜杠
  • 不足
    • unix版本间互不相同的行为模式是的echo的可移植性变得很困难

重定向与管道

重定向符号:

  • <:改变标准输入

program < file 可将program的标准输入修改为file。相当与函数中的参数

  • >:改变标准输出

program > file 可将program的标准输出修改为file。如果file不存在,会创建一个,然而如果已存在,它会被覆盖掉,原本的数据都会丢失。相当与函数中的返回值

  • >>:附加到文件

program >> file 可将program的标准输出附加到file的结尾处。如同>,如果目的文件不存在,>>重定向符便会新建一个。然而,如果目的文件已存在,它不会直接覆盖掉,而是将程序所产生的数据附加到文件结尾处

例子

tr -d '\r' < dos-file.txt > unix-file.txt
# 这条命令先以tr将dos-file.txt里的回车('\r')删除,再降转化完成的数据输出到unix-file.txt文件中。

tr -d '\r' < dos-file.txt >> unix-file.txt
# 这条命令先以tr将dos-file.txt里的回车('\r')删除,再降转化完成的数据追加输出到unix-file.txt文件中。

管道

建立管道符号:|

Program1 | program2 可将program1中的标准输出修改为program2的标准输入

有点

管道可以使得执行速度比使用临时文件的程序快上十倍

例子

# 这条管道会先删除输入文件内的回车字符,在完整数据的排序之后,将内容输入到unix-file.txt文件中
tr -d '\r' < dos-file.txt | sort > unix-file.txt

特殊文件:/dev/null与/dev/tty

/dev/null

位桶,传送到此文件的数据都会被系统丢掉。也就是说当程序将数据写入到此文件时,会认为它已成功完成写入操作,但实际上什么都没有做。但是有一个非常重要的作用:如果只需要命令退出的状态而非它的输出,此功能会特别有用

if grep pattern myfile > /dev/null
then 
	...
else
	...
fi

/dev/tty

当程序打开此文件时,Unix会自动将它重定向到一个终端,也可能是一个通过网络窗口的登录伪终端

$PATH

$path是一个以冒号分隔的目录列表。它存着系统所有的命令,比如ls。因此当我们在终端输入命令的时候,会到这个目录列表查看是否有该命令

查看:

echo $PATH
#/Library/Frameworks/Python.framework/Versions/3.6/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin

重点介绍两个文件:

/usr/bin与/bin:是存放系统的基本命令,即默认路径

/usr/local/bin:是本地系统管理人员【安装程序】,并且是存放程序可执行文件的地址

Shell脚本访问终端命令参数

$0等于命令名,$1等于命令行中第一个参数,$2等于命令行中第二个参数

注:如果参数格式大于10,需要使用花括号括起来。比如第10个参数:${10}

例子:

# 终端
# 创建一个shell脚本文件
vim finduser.sh
###
who | grep $1
###
# 赋予finduser.sh文件可执行权限
chmod +x finduser.sh

# 执行该命令
./finduser.sh ysm
# 由于$1=ysm,而输出:yangshimiao console  Sep 24 11:20 

简单的执行跟踪

使用set -x和set +x命令。set -x表示开始跟踪,set +x表示关闭跟踪。如果打开跟踪则显示每个被执行到的命令,并且在前面加+和空格

例子

# 创建可执行文件
cat > trace.sh
#! /bin/sh
set -x
echo 1st echo
set +x
echo 2nd echo
^D
# 修改权限
chmod +x trace.sh
# 执行权限
./trace.sh
# 输出
# + echo 1st echo
# 1st echo
# + set +x
# 2nd echo

awk命令

作用

做一些简易文本处理,例如取出字段并重新编排。字段是指在文件内容中以空格分隔的字符串。获取字段值的方式为$字段所属下标。即如果文件中的内容是:a b c d e。想要获取c,则可以使用$3获取。为何为3,因为以空格分隔,c是属于第三个值,则为3。

模式与操作方式

awk '{[pattern]action}' filename 或者管道模式:|awk '{[patter]action}'

常用案例

awk '{print $1}' filename # 打印filename中每行的第一个字符串
awk '{print $1,$5}' filename # 打印filename中每行的第一个和第五个字符串
awk '{print $0}' filename # 打印每一行
awk '{print ;}' filename # 打印每一行
awk '$7>1{print ;}' filename # 打印行中第七个字段大于1的所有内容
posted @ 2021-09-25 22:46  Myuniverse  阅读(73)  评论(0编辑  收藏  举报