背景
操作系统简史
-
贝尔实验室Unix(AT&T Unix VS BSD SUN)
-
PC时代(比尔盖斯DOS VS 乔布斯 Apple)
-
CUI时代(比尔盖斯Windows VS 乔布斯 Mac OS VS Linux)
-
移动时代(Google Android VS 乔布斯 IOS)
shell的价值
shell种类
-
常用shell
- bash
- sh
- zsh
-
Windows需要安装cygwin
- Cygwin
- git bash
Windows上没有/etc/shells
bash语言
变量
变量的定义
a=1
b=ascsd
c="hell world"
e='hell from "沐川"'
= 左右不要有空格
如果内容有空格,需要使用单引号或者双引号
变量使用
echo $a
echo ${b}
echo "$a"
使用$var 或 v a r 来 访 问 变 量 。 后 者 更 为 严 谨 。 {var}来访问变量。后者更为严谨。 var来访问变量。后者更为严谨。var_x${var}_x是不同的
变量不需要定义也可以使用。引用未定义的变量,默认为空值
系统预定义变量
输入echo $ 敲两次tab键,系统会自动补齐与定义变量,例如:
[a1111@1111deMacBook-Pro ~ % echo $
! TERM_PROGRAM_VERSION
# TERM_SESSION_ID
$ TIMEFMT
* TMPDIR
- TMPPREFIX
0 TRY_BLOCK_ERROR
? TRY_BLOCK_INTERRUPT
@ TTY
ARGC TTYIDLE
Cdpath UID
COLUMNS USER
cpuTYPE USERNAME
EGID vendOR
EUID WATCH
fignorE WATCHFMT
FPATH WORDCHARS
FUNCnesT xpc_FLAGS
GID xpc_SERVICE_NAME
HISTCHARS ZSH_ARGZERO
HISTCMD ZSH_EVAL_CONTEXT
HISTFILE ZSH_NAME
HISTSIZE ZSH_PATCHLEVEL
HOME ZSH_SUBSHELL
HOMEBREW_BottLE_DOMAIN ZSH_VERSION
HOMEBREW_CELLAR _
HOMEBREW_PREFIX __CFBundleIdentifier
HOMEBREW_REPOSITORY aliases
HOMEBREW_SHELLENV_PREFIX argv
HOST builtins
IFS cdpath
INFOPATH commands
KEYBOARD_HACK dirstack
KEYTIMEOUT dis_aliases
LANG dis_builtins
LINENO dis_functions
LInes dis_functions_source
LISTMAX dis_galiases
LOGCHECK dis_patchars
LOGNAME dis_reswords
LaunchInstanceID dis_saliases
MACHTYPE fignore
MAILCHECK fpath
MAILPATH funcfiletrace
MANPATH funcsourcetrace
MATCH funcstack
MBEGIN functions
MEND functions_source
MODULE_PATH functrace
NULLCMD galiases
OLDPWD histchars
OPTARG history
OPTIND historywords
OSTYPE jobdirs
PATH jobstates
PPID jobtexts
PROMPT key
PROMPT2 keymaps
PROMPT3 mailpath
PROMPT4 manpath
PS1 module_path
PS2 modules
ps3 nameddirs
PS4 options
PSVAR parameters
PWD patchars
RANDOM path
READNULLCMD pipestatus
SAVEHIST precmd_functions
SECONDS prompt
SecuritySESSIONID psvar
SHELL reswords
SHELL_SESSION_DID_HISTORY_CHECK saliases
SHELL_SESSION_DID_INIT signals
SHELL_SESSION_DIR status
SHELL_SESSION_FILE termcap
SHELL_SESSION_HISTFILE terminfo
SHELL_SESSION_HISTFILE_NEW userdirs
SHELL_SESSION_HISTFILE_SHARED usergroups
SHELL_SESSION_HISTORY watch
SHELL_SESSION_TIMESTAMP_FILE widgets
SHLVL zle_bracketed_paste
SPROMPT zsh_eval_context
SSH_AUTH_SOCK zsh_scheduled_events
TERM zshexit_functions
TERM_PROGRAM
数组变量
array=(1 2 3 4 5)
array=('ls')
echo ${array[2]} # 取数组名为array中下角标为2的值
echo ${array[*]} # 取数组名为array中所有值
echo ${#array[*]} # 打印数组长度
使用()来定义数组变量,中间使用空格隔开
特殊符号的使用
- 双引号用于括起一段字符串,支持$var形式的变量转换
a1111@1111deMacBook-Pro ~ % a=MuChuan
a1111@1111deMacBook-Pro ~ % echo "hoell world ${a}"
hoell world MuChuan
a1111@1111deMacBook-Pro ~ % echo 'hoell world ${a}'
hoell world ${a}
- \ 反斜线,某些情况下表示转义
a1111@1111deMacBook-Pro ~ % echo -e "hoell world \n ${a}"
hoell world
MuChuan
-
$(ls) 表示执行ls后的结果。与``类似。不过可以嵌套
-
( ( ) ) 对 变 量 进 行 操 作 , 例 如 相 加 (())对变量进行操作,例如相加 (())对变量进行操作,例如相加((a+b))$((2+3))
a1111@1111deMacBook-Pro ~ % a=1
a1111@1111deMacBook-Pro ~ % b=2
a1111@1111deMacBook-Pro ~ % echo $((a+b))
3
-
(())是整数扩展。把里面对变量当作整数去处理
-
({1…10})等价于seq1 10。表示1到10
变量类型
字符串:a="asda"
数字:b=1
布尔型:c=ture d=false
数字型变量操作
计算:i=1;echo $i;echo $((i+1))
更新:((i=i+1));echo $i
只能进行整数计算
浮点型计算需要使用awk 'BEGIN{print 1/3}'
字符串操作
-
取值
-
${value:offset} ${value:offset:length}
从变量中提取子串a1111@1111deMacBook-Pro ~ % echo ${a:0:5} holl a1111@1111deMacBook-Pro ~ % echo ${a:1:5} oll w
-
${#value}
字符串的长度a1111@1111deMacBook-Pro ~ % echo ${#a} 18
-
${#array[*]} ${#array[@]}
表示数组中元素的个数a1111@1111deMacBook-Pro ~ % echo ${#a[*]} 18
-
-
掐头去尾与内容替换
-
${value#pattern} ${value##pattern}
# 表示掐头a1111@1111deMacBook-Pro ~ % echo ${a#h} oll world muchuan
-
${value%pattern} ${value%%pattern}
% 表示去尾a1111@1111deMacBook-Pro ~ % echo ${a%%muchuan} holl world
-
${value/pattern/string} ${value//pattern/string}
/表示替换a1111@1111deMacBook-Pro ~ % echo ${a/muchuan/par} holl world par
-
#与##、%与%%、/与//的区别:最短匹配模式VS最长匹配模式
-
${value/#Pattern/Replacement} ${value/%Pattern/Replacement}
-
布尔变量
a1111@1111deMacBook-Pro ~ % ls
Applications Library Postman node_modules
Desktop Movies Public package-lock.json
Documents Music PycharmProjects sensors
Downloads Pictures Sunlogin Files
a1111@1111deMacBook-Pro ~ % echo $?
0
a1111@1111deMacBook-Pro ~ % ls 1111111111;echo $?
1
a1111@1111deMacBook-Pro ~ %
判断的类型
算术判断
-
[ 2 -eq 2 ]相等
a1111@1111deMacBook-Pro ~ % [ 2 -eq 2 ];echo $? 0
-
[ 2 -ne 2 ]不想等
a1111@1111deMacBook-Pro ~ % [ 2 -ne 2 ];echo $? 1
-
[ 3 -gt 1 ]大于
a1111@1111deMacBook-Pro ~ % [ 3 -gt 1 ];echo $? 0
-
[ 3 -ge 3 ]大于等于
a1111@1111deMacBook-Pro ~ % [ 3 -ge 3 ];echo $? 0
-
[ 3 -lt 4 ]小于
a1111@1111deMacBook-Pro ~ % [ 3 -lt 4 ];echo $? 0
-
[ 3 -le 3 ]小于等于
a1111@1111deMacBook-Pro ~ % [ 3 -le 3 ];echo $? 0
-
(())也可表示算术比较。((3>4))
a1111@1111deMacBook-Pro ~ % ((3>4));echo $? 1
字符串判断
-
[ string1 = string2 ] 如果两字符串相同,则结果为真
a1111@1111deMacBook-Pro ~ % [ "qwer" = "qwer" ];echo $? 0 a1111@1111deMacBook-Pro ~ % [ "qwer" = "qwe" ];echo $? 1
-
[ string1 != string2 ] 如果两字符串不相同,则结果为真
a1111@1111deMacBook-Pro ~ % [ "qwer" != "qwe" ];echo $? 0 a1111@1111deMacBook-Pro ~ % [ "qwer" != "qwer" ];echo $? 1
-
[ -n “$var” ] 如果字符串非空,则结果为真
a1111@1111deMacBook-Pro ~ % a="qwer";[ -n "$a" ];echo $? 0 a1111@1111deMacBook-Pro ~ % a="";[ -n "$a" ];echo $? 1
-
[ -z “$var” ] 如果字符串为空,则结果为真
a1111@1111deMacBook-Pro ~ % a="";[ -z "$a" ];echo $? 0 a1111@1111deMacBook-Pro ~ % a="qwer";[ -z "$a" ];echo $? 1
-
[[ “xxx” == “x” ]] 在表达式中表示0或多个字符
a1111@1111deMacBook-Pro ~ % [[ "muchuan" == m* ]];echo $? 0
-
[[ xxx == x?? ]]在表达式中表示单个字符
a1111@1111deMacBook-Pro ~ % [[ "muchuan" == m?? ]];echo $? 1
-
在引用变量的时候要记得加双引号[ -z “$a” ] 否则当a未定义时语法会被错
逻辑判断
-
[ 2 -ge 1 -a 3 -ge 4 ] 与
a1111@1111deMacBook-Pro ~ % [ 2 -ge 1 -a 3 -ge 4 ];echo $? 1
-
[ 2 -ge 1 -o 3 -ge 4 ] 或
a1111@1111deMacBook-Pro ~ % [ 2 -ge 1 -o 3 -ge 4 ];echo $? 0
-
[ 2 -ge 1 && 3 -ge 4 ] 与
a1111@1111deMacBook-Pro ~ % [ 2 -ge 1 && 3 -ge 4 ];echo $? 1
-
[ 2 -ge 1 || 3 -ge 4 ] 或
a1111@1111deMacBook-Pro ~ % [ 2 -ge 1 || 3 -ge 4 ];echo $? 0
-
[ ! 2 -ge 1 ] 非
a1111@1111deMacBook-Pro ~ % [ ! 2 -ge 1 ];echo $? 1
shell内置判断
-
-e file 如果文件存在,则结果为真
a1111@1111deMacBook-Pro ~ % [ -e package-lock.json ];echo $? 0 a1111@1111deMacBook-Pro ~ % [ -e package-loc.json ];echo $? 1
-
a1111@1111deMacBook-Pro ~ % [ -d package-loc.json ];echo $? 1 a1111@1111deMacBook-Pro ~ % [ -d Music ];echo $? 0
-
a1111@1111deMacBook-Pro ~ % [ -f Music ];echo $? 1 a1111@1111deMacBook-Pro ~ % [ -f package-lock.json ];echo $? 0
-
-r file 如果文件可读,则结果为真
-
-s file 如果文件长度不等于0,则结果为真
-
-w file 如果文件可写,则结果为真
-
-x file 如果文件可执行,则结果为真
-
[[]] 是 [] 的扩展语法,在老的sh里并不支持。推荐使用[]