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的所有内容