==了解== 熟悉 掌握 精通

一些概念

shell默认命令阻塞

shell独有的

取当前路径

pwd:获取的是工作目录,而不是正执行脚本命令。
意思是,从哪里调用的这个脚本,就显示哪里,而不是此脚本存在的路径。

$:
$0 当前文件名。在zsh下会输出-zsh。
$1$2$3… 输入的第几个参数。运行./script.sh arg1 arg2 arg3,第一个就是$1,以此类推。
$@$*,输入的全部参数。区别是$@的每个参数独立,类似list。$*参数当成一个整体,参数之间用 IFS(内部字段分隔符,默认为空格)分隔。

bash和zsh都适用的命令,获取当前执行脚本的父目录:

# 此脚本文件的绝对路径
SCRIPT_FILE=$(readlink -f $0)

# 此脚本文件所在文件夹的绝对路径
SCRIPT_DIR=$(dirname $SCRIPT_FILE)

# 注意:这两行要分开写,不要合并成一句,否则变量内容为空。

echo打印

不加引号:直接输出
但是如果内容有空格,它只会识别第一个空格前的内容。所以这个方法不能处理带空格的,好比path=/Users/Local Document就不行。

单引号:直接输出,不转义

n=3
echo '$n'
[打印]>> $n

它可以取代⬆️且不用担心空格

双引号:转义

n=3
echo "$n"
[打印]>> 3

需要提示的是,如果写的内容本身没有需要转义的,那它就退化成直接输出。比如"path=/Users/Local Document"和上面效果一样。

💡 所以一般变量保险起见要加引号,以防变量里有空格。

反引号:执行命令。相当于$(),且$()支持嵌套。但反引号支持的sh多。

USERS=`who | wc -l`
echo "Logged in user are $USERS"
[打印]>> Logged in user are 1

显示变量 前面加$
var=value //赋值操作,等号左右空格var = value 是相等操作
echo $var

遇到的一个问题 涉及到引号的使用。
当前用户目录都知道可以写成~,但是当定义了包含~的path时,"本身不会转义。即:
$mypath="~/work"
然后再 cp $mypath/file.txt /folder时,第一个路径直接是~/work,而不是当作/Users/你的用户名/work,即双引号下它没有解析,而是直接当字符串用了。

解决这个问题比较方便的方式:

  1. 定义的时候不加双引号,直接$mypath=~/work
  2. $HOME代替~,写成$mypath=$HOME/work

我感觉第二个比较好一点。

条件测试

[ 和 ] 用于条件测试;

状态返回值

echo $? 查看
返回0为成功。非0为错。

条件判断

语法

if [ command ];then
   // todo
elif [ command ];then
    // todo
else
    // todo
fi

字符串

相等:=
不等:!=
是否为空:①字符串本身 ②字符串前-z:空为真 ③字符串前-n:非空为真

数字

A x B:
=:-eq;!=:-ne

-gt;>=:-ge
<:-lt;<=:-le

字符、文件/文件夹判断

一般用在if [ {判断条件} ] 处。反选为 if [ ! {判断条件} ]
括号两端要留空格;结尾要写 fi
-e 对象【文件,包括目录】存在
-d 文件夹【目录】存在 (判断对象是目录)
-f 文件【常规文件,非目录or设备文件】存在
-s 文件长度不为0
-r/-w/-x 文件可读/可写/可执行
比较:A x B
-nt:A 比 B 新
-ot:A 比 B 老
-ef:AB指向同个文件

逻辑

或:
if (( a > b )) || (( a < c ))
if [[ $a > $b ]] || [[ $a < $c ]]
if [ $a -gt $b -o $a -lt $c ]

且:
if (( a > b )) && (( a < c ))
if [[ $a > $b ]] && [[ $a < $c ]]
if [ $a -gt $b -a $a -lt $c ]

非:
if [[ ! -d "$dir" ]]

常规数据类型

列表

定义:
aList=(value1 value2 value3)

追加:
aList+=(new_element)

输出:

echo ${aList[1]} # 第二个
echo ${aList[-3]} # 倒数第三个
echo ${aList[@]} # 全部

循环:

for i in ${aList[@]}; do
	echo $i
done