==了解== 熟悉 掌握 精通
一些概念
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
,即双引号下它没有解析,而是直接当字符串用了。
解决这个问题比较方便的方式:
- 定义的时候不加双引号,直接
$mypath=~/work
- 用
$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